2017-01-27 13 views
3

JS에 대한 몇 가지 문서를보고 있으며 임시 변통 '열거 형'으로 문자열을 사용하고 있습니다. 내 응용 프로그램에서이를 대수 데이터 유형 인 ADT로 표현하는 것이 좋습니다. 그러나 ADT를 외국 함수 인터페이스 인 FFI에 대한 객체의 String으로 변환하는 가장 좋은 방법은 무엇인지 모르겠습니다. 개념적으로 감안할 때 :PureScript ADT를 JS 문자열로 변환하는 방법 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" } 
    } 
} 

은 느릅 나무에서 나는 함께 그것을 전달하는 JS 객체로 기록을 변환하는 coreJson.Encode을 사용하는 것입니다,하지만 난 모르겠어요 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을 수출하지 않도록 다음 quux으로 FFI 기능 _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