【发布时间】:2012-03-22 09:35:47
【问题描述】:
我认为原则上 Haskell 的类型系统会禁止从纯函数调用不纯函数(即f :: a -> IO b),但今天我意识到通过使用return 调用它们,它们编译得很好。在这个例子中:
h :: Maybe ()
h = do
return $ putStrLn "???"
return ()
h 在 Maybe monad 中工作,但它仍然是一个纯函数。编译和运行它只返回Just (),正如人们所期望的那样,实际上没有做任何I/O。我认为 Haskell 的懒惰将这些东西放在一起(即 putStrLn 的返回值没有被使用 - 并且不能因为它的值构造函数被隐藏并且我无法对其进行模式匹配),但为什么这段代码是合法的?还有其他原因允许这样做吗?
作为奖励,相关问题:一般来说,是否可以完全禁止从其他单子中执行单子的操作,以及如何?
【问题讨论】: