我对 Haskell 中的 Monad 很陌生,正在尝试通过创建实例来增加我的知识。但是,在处理该实例时遇到了一些错误,已经花费了一定时间,仍然不确定问题出在哪里。希望得到帮助和解释。这是我目前所做的,有任何想法或建议吗?
newtype ST b = S (Int -> (b, Int))
runState :: ST b -> Int -> (b, Int)
runState (S b) st = b st
instance Monad ST where
return :: b -> ST b
return x = S (\st -> (x, st)) the new state with a b
(>>=) :: ST b -> (b -> ST c) -> ST c
c >>= c' = S (\st1 ->
let (b, st2) = runState c st1
(c, st3) = runState (c' b) st2
in (c, st3))
c >>= ...
和(c, st3) = ...
。 - md2perpe(>>=) :: ST b -> (b -> ST c) -> ST c
- tDownUnder(>>=) :: ST b -> (b -> ST c) -> ST c
这一行中的c
与c >>= ...
或(c, st3) = ...
中的c
不会发生冲突,因为在第一种情况下它是一个类型变量,而在后一种情况下它是一个普通(值)变量。我所指的是你在>>=
左边有一个c
,然后在(c, st3) = ...
中引入另一个c
。将后者重命名为t''
。 - md2perpeMonad
and others can be derivedvia
State Int
:newtype ST b = S (Int -> (b, Int)) deriving (Functor, Applicative, Monad, MonadFix) via State Int
- Iceland_jack