将记录传递给ffi

时间:2014-11-14 16:53:32

标签: fay

当我将记录传递给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 个答案:

答案 0 :(得分:0)

如果你在FFI中有一个类型变量或Ptr X,那么thunks将会保留并且不会发生类型转换,而具体类型或Automatic a则相反。

我认为你想要的是:: Passable a => Automatic a -> Fay ()强迫任何一击。它应该相当于用一个单态参数将它分成两个函数。将AutomaticText之类的外来类型一起使用只会强制使用thunk而不进行任何类型的转换。

相关问题