2016-09-22 6 views
3

나는 현실 세계 하스켈에서 모나드 변압기를 조사하고있었습니다. 이 책은 모나드 변압기를 만들기 위해 MonadTrans 유형 클래스의 인스턴스로 만들어야한다고 말했습니다.모나드 변압기 리프트

그래서이 책에서는 새로운 변압기 인 MaybeT m a 변압기를 정의했습니다.

그들은이 새로운 변압기의 monadTrans 형 클래스를 정의 : 내가 리프트 기능이 복용 이해하는 것과

instance (MonadState s m) => MonadState s (MaybeT m) where 
    get = lift get 
    put k = lift (put k) 

: 그들은이 변압기에 대한 MonadState의 인스턴스를 만든 다음

instance MonadTrans MaybeT where 
    lift m = MaybeT (Just `liftM` m) 

근원적 ​​인 모나드를 만들고 그것을 오른쪽 생성자로 감싼다. 그러나 MonadState 유형 클래스를 가져 오거나 구현하는 방법에 대한 구현을 얻지 못했습니다. 실제로 여기에서 리프트가 실제로 무엇을하는지 이해하는 데 도움이 필요합니다. 또한 타입 클래스가 어떻게 정의 되었기 때문에 mtl 패키지에서 WriterT, StateT 등으로 모나드 변압기 스택을 가질 수 있다고 들었지만 get, put, tell 등의 함수를 실제로 들지 않고도 사용할 수 있습니다. 나는 이것이 어떻게 작동하는지 궁금 해서요, 저는 강하게이 타입 수업들과 관련이 있다고 생각하지만 확실하지 않습니다.

답변

1

하지만 실제로 그 기능이 실제로 예에 정의되어 있기 때문입니다 어떤 리프팅

을하지 않고 등을 넣어 얻을 같은 기능을 사용하여 말할 수 MonadState typeclass가 아니라 State 유형입니다. 그런 다음

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

, 모두 StateStateT 우리가 MaybeT m의 내부 모나드가 (충족 것을 알고있는 경우, 귀하의 예제 인스턴스에서 1

가능한 사람들을 사용하여 만드는 클래스의 인스턴스를 만들어) MonadState s의 경우, 외부 모나드 전체를 MonadState s으로 처리 할 수 ​​있습니다. 즉, 내부 모나드로 지정된 작업을 들어서 외부 모서리에 맞게 처리하면 lift으로 끝납니다. 일반 영어

, 즉 "같은 소리 것 유형 s의 상태 (MonadState) 모나드 일부 모나드 m을 통해 MaybeT 변압기 변환 (랩), 결과 유형은 그 유형에 대한 상태 모나드 인 경우 ". State s a 실제로 StateT s Identity a로 구현되어 있기 때문에


1이 실제로 하나의 인스턴스입니다. 구현 세부 사항은 Refer to the sources입니다.

+0

만약 우리가'MaybeT (State Int) String'과 같은 것을 가지고 있다면, 우리는 이것을 사용합니다. 무슨 일이 일어나는지, 실제 들어 올림이 어떻게 작동하는지 이해하는 데 문제가 있다고 생각합니다. 리프트 기능으로 전달되는 것은 무엇입니까? – Zubair

+0

@Zubair'lift'는 내부 모나드로 향하는 액션을 취해 외부 모나드에 싸서 돌려줍니다. IOW,이 특별한 경우에,'lift :: State Int String -> MaybeT (State Int) String'. –