2017-01-27 66 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