이, 내가 데이터 유형수정 모나드 상태
data Tree a = Branch (Tree a) a (Tree a) | Leaf
deriving (Eq, Ord, Show)
의 트리를 가지고와 Int
각 a
레이블을 가정하고, 점점 더 깊이 우선의 순서, 상태 모나드를 사용하여, 모나드 행위의 수를 센다. 여기
newtype State' s a = State' { runState' :: (s, Counts) -> (a, s, Counts) }
내
label
의 구현 및
run
label :: MonadState m Int => Tree a -> m (Tree (Int, a))
label Leaf = return Leaf
label (Branch left value right) = do
newLeft <- label left
int <- get
put (int + 1)
newRight <- label right
return (Branch newLeft (int, value) newRight)
run :: State' s a -> s -> (a, Counts)
run s ns = let (a, _, counts) = runState' s (ns, Counts 0 0 0 0) in (a, counts)
있습니다 : 예를 들어, 표현
let tree = Branch (Branch Leaf "B" Leaf) "A" Leaf
in run (label tree) 42
는
(Branch (Branch Leaf (42, "B") Leaf) (43, "A") Leaf
, Counts {binds = 10,returns = 5, gets = 4, puts = 2})
에 국가의 유형은 평가해야 내가 테스트 케이스를 실행할 때
그러나, 나의 결과는
(Branch (Branch Leaf (42,"B") Leaf) (42,"A") Leaf
, Counts {binds = 12, returns = 5, gets = 6, puts = 2})
그것은 전혀 업데이트되고 있지 않은 Int
을 것입니다. 할당의 각 부분에 대해 별도의 테스트 케이스가 있기 때문에 이는 이상합니다.이 부분을 제외한 모든 부분은 정확합니다. 어쨌든 여기에 get 및 put 구현이 있습니다.
-- get :: State' s s
get = State' (\(s, counts) -> (s, s, counts <> oneGet))
-- put :: s -> State' s()
put x = State' (\(x, counts) -> ((), x, counts <> onePut))
정말 실망합니다. Int
이 전혀 영향을받지 않는 이유를 모르겠습니다. 어떤 도움이라도 대단히 감사합니다.
'인스턴스 모나드 스테이트'의 구현을 보여주지는 않았지만 모나드 법칙을 만족시키지 못한다고 거의 보장 할 수 있습니다. 'return'과'bind'를 세는 것은'return x >> = f = f x'와'm >> = return = m'과 호환되지 않습니다. (그것은 당신의 문제와 전혀 관련이 없습니다!) –