我正在努力学习Haskell。我编写了一个使用全局状态的代码,可以使用两个函数(即change1和change2)来改变它。此外,我已经包括镜头,所以我也可以学习它。问题是代码的最后一行。我不明白为什么我不能将最后两行包括在一起。如果我删除其中任何一个,它就会运行。
0
编辑:我有点困惑:为什么下面的代码运行没有错误?
1
答案 0 :(得分:4)
在你的情况下,do-notation
是
(runState ma (Dp 2 3)) >> (evalState ma (Dp 2 3))
(>>)
的类型为Monad m => m a -> m b -> m b
,这意味着runState ma (Dp 2 3)
和evalState ma (Dp 2 3)
必须位于同一个monad中,但它们不是
但代码并不是出于其他原因而无法正常工作。函数main
具有以下类型注释:main :: IO a
这意味着main
期望在其中执行操作(例如打印结果)
main :: IO ()
main = do
print $ runState ma (Dp 2 3)
print $ evalState ma (Dp 2 3)
这很有效,因为
print $ runState ma (Dp 2 3)
的类型为IO ((), Dp)
print $ evalState ma (Dp 2 3)
的类型为IO ()
因此,>>
的推断类型为IO ((), Dp) -> IO () -> IO ()
,并不违反Monad m => m a -> m b -> m b
。结果类型为IO ()
,适合main :: IO a