Передача записей в ffi

Когда я передаю запись в javascript, она работает:

data Record = Record {
  elem :: String
}
doSomethingForeign :: Record -> Fay ()
doSomethingForeign = ffi " callJsFun(%1) "

Но когда функция не является мономорфной, запись не оценивается, нужно сделать это вручную:

class Passable a
instance Passable Record
instance Passable Text
doSomethingForeign' :: (Passable a) => a -> Fay ()
doSomethingForeign' = ffi " callJsFun(Fay$$_(%1)) "

Это простой случай, когда дополнительный набор Fay$$_ Это не раздражает, но если я передам js более сложные структуры с параметрами типа, то добавлю просто Fay$$_ не решит Я хотел бы знать правило, когда применяется оценка для нативных типов JS, а где нет.

1 ответ

Решение

Thunks останется, и преобразования типов не произойдут, если у вас есть переменная типа или Ptr X в FFI, в отличие от конкретного типа или Automatic a где применяется обратное.

Я думаю, что вы хотите здесь :: Passable a => Automatic a -> Fay () навязать какой-нибудь гром. Это должно быть эквивалентно разделению этого на две функции с мономорфным аргументом. С помощью Automatic с иностранным типом, таким как Text будет только форсировать и не делать никаких преобразований типов.

Другие вопросы по тегам