나는 현실 세계 하스켈에서 모나드 변압기를 조사하고있었습니다. 이 책은 모나드 변압기를 만들기 위해 MonadTrans 유형 클래스의 인스턴스로 만들어야한다고 말했습니다.모나드 변압기 리프트
그래서이 책에서는 새로운 변압기 인 MaybeT m a
변압기를 정의했습니다.
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 등의 함수를 실제로 들지 않고도 사용할 수 있습니다. 나는 이것이 어떻게 작동하는지 궁금 해서요, 저는 강하게이 타입 수업들과 관련이 있다고 생각하지만 확실하지 않습니다.
만약 우리가'MaybeT (State Int) String'과 같은 것을 가지고 있다면, 우리는 이것을 사용합니다. 무슨 일이 일어나는지, 실제 들어 올림이 어떻게 작동하는지 이해하는 데 문제가 있다고 생각합니다. 리프트 기능으로 전달되는 것은 무엇입니까? – Zubair
@Zubair'lift'는 내부 모나드로 향하는 액션을 취해 외부 모나드에 싸서 돌려줍니다. IOW,이 특별한 경우에,'lift :: State Int String -> MaybeT (State Int) String'. –