2014-11-14 1 views
0

Когда я прохожу запись в JavaScript, он работает:Попутный записи в FFI

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

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

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

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

ответ

0

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

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