2017-01-27 61 views
3

我正在查看JS的一些文檔,它使用字符串作爲臨時'枚舉'。在我的應用程序中將它表示爲代數數據類型ADT會更好一些;然而,我不確定在外部函數接口FFI的對象上使用這個ADT到String的最好方法是什麼。鑑於概念:如何將PureScript ADT轉換爲JS字符串enum'FFI

data Foo = Bar | Baz 

type Qux = { foo :: Foo } 

foreign import quux :: forall e. Qux -> Eff (console :: CONSOLE | e) Unit 

main = do 
    quux { foo : Bar } 

qux{ foo : "bar" | "baz" }

exports.quux = function(qux) { 
    return function() { 
    console.log(qux) 
    //=> Object { foo : "bar" } 
    } 
} 

在榆樹我會使用Json.Encodecore的記錄轉變成一個JS對象傳遞下去,但我不知道在PureScript中的模擬。

回答

3

我會做這樣的事情:

data Foo = Bar | Baz 

printFoo :: Foo -> String 
printFoo = case _ of 
    Bar -> "bar" 
    Baz -> "baz" 

type Qux = { foo :: Foo } 

foreign import _quux :: forall e. { foo :: String } -> Eff (console :: CONSOLE | e) Unit 

quux :: forall e. Qux -> Eff (console :: CONSOLE | e) Unit 
quux args = _quux { foo: printFoo args.foo } 

main = do 
    quux { foo : Bar } 

的想法是你quux適應的FFI功能_quux的參數,然後避免從模塊輸出_quux,所以纔有了「安全」界面無障礙。

這種方法的另一個好處是,你可以給quux功能更PS友好的參數設置,如通過記錄作爲選項不是一般的常態,除非函數要接受很多東西:

quux :: forall e. Foo -> Eff (console :: CONSOLE | e) Unit 
quux foo = _quux { foo: printFoo foo } 

main = do 
    quux Bar 

基本上我所建議的是,無論何時使用FFI,您都希望儘可能在FFI中儘可能少地完成工作,並在PS中處理儘可能多的實施。這樣,編寫的代碼中的更多代碼仍然可以由編譯器檢查,並且不必在JS中做任何聰明的事情,或者編寫可能會在PS的實現細節在未來版本中發生變化時會中斷的事情。

+0

是的,我覺得還有更多的東西,只要創建一種接口 – toastal