2014-11-14 60 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

如果在FFI中有一個類型變量或Ptr X,與具體類型或Automatic a相反,則相反,類型轉換不會發生。

我想你在這裏想要的是:: Passable a => Automatic a -> Fay()強制任何thunk。它應該等價於將它分解爲具有單形變量的兩個函數。使用Automatic與外國類型,如Text將只會強制thunk而不進行任何類型的轉換。