2016-06-28 8 views
2

나는 Prompt의 정의를 통해 작업 중이며 Bind 인스턴스는 here으로 설명되어 있으며 Purescript에서 어떻게 보이는지 알아 내려고했습니다.Pseudcript의 프롬프트 Monad

실존 유형에 Purescript.Exists을 사용하고 있습니다. 내 (고화질)은 다음과 같습니다 runExists 작업 할 때

나는 특히 Bind 인스턴스에서 Ask 케이스를 쓰기에 부착하고
data PromptAskF p r a 
    = PromptAskF (p a) (a -> Prompt p r) 

type PromptAsk p r = Exists (PromptAskF p r) 

data Prompt p r 
    = Ask (PromptAsk p r) 
    | Answer r 

instance bindPrompt :: Bind (Prompt p) where 
    bind (Answer x) k = k x 
    bind (Ask ask) k = ??? 

, 나는 유형에 대한 매우 혼란 스러워요.

이 인스턴스는 어떻게 작성해야합니까?

감사합니다, 트릭을해야이 같은

마이클

답변

1

뭔가 :

data PromptAskF p r a 
    = PromptAskF (p a) (a -> Prompt p r) 

type PromptAsk p r = Exists (PromptAskF p r) 

mapPA 
    :: forall p r r' 
    . (forall a. (a -> Prompt p r) -> (a -> Prompt p r')) 
    -> PromptAsk p r 
    -> PromptAsk p r' 
mapPA f = runExists \(PromptAskF req cont) -> mkExists $ PromptAskF req (f cont) 

data Prompt p r 
    = Ask (PromptAsk p r) 
    | Answer r 

instance functorPrompt :: Functor (Prompt p) where 
    map f (Answer r) = Answer (f r) 
    map f (Ask ask) = Ask $ mapPA (map (map f)) ask 

instance applyPrompt :: Apply (Prompt p) where 
    apply = ap 

instance applicativePrompt :: Applicative (Prompt p) where 
    pure = Answer 

instance bindPrompt :: Bind (Prompt p) where 
    bind (Answer x) k = k x 
    bind (Ask ask) k = Ask $ mapPA (\cont ans -> cont ans >>= k) ask 

instance monadPrompt :: Monad (Prompt p) 

mapPA 기능은 반복적으로 runExists/mkExists하지 않고 PromptAskF 계속 업데이트를위한 편의이다.

+0

안녕 게리, 답변 주셔서 감사합니다. 이것은 나에게 의미가 있지만, 분명히 형식 검사기에는 해당되지 않습니다! 다음과 같은 오류가 발생합니다 :'Error found : in module Main at line 26, column 1 - line 30, column 26 유형 변수가 범위를 벗어났습니다. 식에서 (flip runExists) 값 선언에 을 묻습니다. bindPrompt' –

+0

방금 ​​실제로이 시간을 typechecks하기 위해 전체 구현을 포함하도록 답변을 업데이트했습니다! 즉, 오류 메시지는'runExists'을 flip'ping '때문이 경우, 때때로 처리하는 것은 매우 어려울 수 있지만, 일부 불확실성이 있었다하더라도 그 이후의 (a'가 where' 발생하지 않고에서 람다 골로 연결되지 못했습니다). 그것을'runPA'로 옮기면 읽기가 조금 쉬워지고, 매핑 함수에 명시적인 타입 시그니처를 제공하면 다른 잠재적 인 skolem escape 문제를 피할 수 있습니다. –

+0

굉장! 업데이트 시간을내어 주셔서 감사합니다. 명시 적 rank-n 유형 덕분에 지금은 하스켈 구현보다 훨씬 명확합니다. –