哈斯克尔:国家莫纳德

时间:2017-07-25 18:27:09

标签: haskell state-monad

我正在努力学习Haskell。我编写了一个使用全局状态的代码,可以使用两个函数(即change1和change2)来改变它。此外,我已经包括镜头,所以我也可以学习它。问题是代码的最后一行。我不明白为什么我不能将最后两行包括在一起。如果我删除其中任何一个,它就会运行。

0

编辑:我有点困惑:为什么下面的代码运行没有错误?

1

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