2010-04-17 2 views
10

상태 모나드 "인터페이스"는연속 모나드 "인터페이스"

class MonadState s m where 
    get :: m s 
    put :: s -> m() 

(+ 창 및 바인드) State 생성자를 사용하지 않고 주 모나드와 가능한 연산을 구성 할 수있다. 예를 들어, State $ \s -> (s+1, s-1)은 내가 ask, return(>>=)을 사용하여 해당 계산을 만들 수 있기 때문에, Reader 생성자를 사용하지 않아도,

do s <- get 
    put (s-1) 
    return (s+1) 

이와 비슷하게과 같이 쓸 수있다. 정확하게 : Reader f == ask >>= return . f.

그것은 연속 요청에 대해 같은 사실인가 - 그것은 반환하고 바인드 ( MonadCont 유일한 기능) callCC를 사용 Cont r a의 모든 인스턴스를 작성하고 Cont (\c -> ...) 같은 것을 입력하지 않을 수 있습니까?

답변

7

저는 그렇게 생각하지 않습니다. 유형을 보면 : 당신은 단지 callCC이있는 경우

Cont :: ((a -> r) -> r) -> Cont r a 
callCC :: ((a -> Cont r b) -> Cont r a) -> Cont r a 

은, 어디서든 형식으로 r의 아무 소용이 없다 - 그것은 어떤 종류의 수 있습니다. 난 단지 callCC이있는 경우

Cont (const 42) :: Cont Int a 

내가 r을 제약의 방법이 없습니다 : 그래서 당신은 예를 들면 형태로 사용 무언가를 번역 할 수있는 방법을 모르겠어요.

어쨌든, 그건 내 직감입니다. 대단히 엄격하지는 않지만 설득력있는 것처럼 보입니다.

+1

그러나 내가 계속 연장을 구분하면이 변경 사항을 기대합니다 ... –