Передача записей в 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
будет только форсировать и не делать никаких преобразований типов.