나는 어려운 나를 MonadState을 이해하기 위해 찾을 수 있습니다.레코드 구문을 사용하지 않고 MonadState 클래스를 구현하는 방법은 무엇입니까?
이유는 어쩌면 자신의 데이터 구조에 기록 구문과 함께 혼합 대부분의 예제.
그래서 레코드 구문을 사용하지 않고 MonadState을 구현하려고했습니다.
내가 쓴 다음 코드는 컴파일러를 통과했지만 그것은 나에게 완전히 말도 안되는 것 같습니다.
는이 코드에 어떤 문제가 있습니까?
레코드 구문을 사용하지 않고 MonadState을 구현하는 간단한 예제가 있습니까?
data Foo a b = Foo (Maybe ([a],b)) deriving (Show)
unwrapFoo :: Foo a b -> Maybe ([a],b)
unwrapFoo (Foo x) = x
instance Monad (Foo [a]) where
return x = Foo $ Just ([], x)
m >>= f = case unwrapFoo m of
Just (_, r) -> f r
Nothing -> Foo Nothing
instance MonadState Int (Foo [a]) where
get = Foo $ Just ([], 1)
put _ = Foo $ Just ([],())
*Main> get :: Foo [a] Int
Foo (Just ([],1))
*Main> put 3 :: Foo [a]()
Foo (Just ([],()))
*Main>
가능합니다. 특정 클래스에 대해 "단지 일부 인스턴스"를 구현하는 방법을 배우는 것은 거의 요지가 없으며 다양한 클래스의 요구 사항에 맞게 데이터 유형을 설계하는 것이 좋습니다. 또는 어떤 문제에 대한 데이터 유형을 설계하고 갑자기 "이봐 요, 이건 '국가'모나드와 같이 행동합니다. 아마도 '모나드 스테이트'의 인스턴스가되어야할까요? - 보통, Monad * 클래스를 위해 그것을 할 필요는 없다. 적당한 변압기 스택을 사용하면된다. – leftaroundabout
'newtype Foo s a = Foo (s -> (s, a))'로 시작하십시오. (-> (S, A)의)'실제로 유형의 함수 '의 래퍼 인 데이터 유형 MonadState을 구현 – dave4420