0

当我将记录传递给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 类型的评估,什么时候不应用。

4

1 回答 1

0

Ptr X如果您有类型变量或在 FFI 中,则 thunk 将保留并且不会发生类型转换,这与具体类型或Automatic a相反的情况相反。

我认为您在这里想要的是:: Passable a => Automatic a -> Fay ()强制任何重击。它应该等效于将其分成两个具有单态参数的函数。使用Automatic外部类型,例如Text只会强制 thunk 而不会进行任何类型转换。

于 2014-11-17T08:23:53.107 回答