我认为,原则上haskell的类型系统将禁止从纯粹的函数中调用不纯的函数(即f :: a -> IO b
),但今天我意识到通过return
来调用它们,它们编译得很好。在例如:现在纯函数中IO操作的含义是什么?
h :: Maybe()
h = do
return $ putStrLn "???"
return()
,h
作品中,也许单子,但它是一个纯函数不过。编译并运行它只需返回Just()
,而不需要实际执行任何I/O操作。我认为哈斯克尔的懒惰把东西放在一起(即putStrLn
的返回值没有被使用 - 因为它的值构造函数是隐藏的,我无法对它进行模式匹配),但为什么这个代码是合法的呢?是否有任何其他原因使得这个允许?
作为一个奖励,相关问题:一般来说,是否有可能从其他内部禁止monad的所有操作?怎么样?
如何让monad从另一个执行动作的能力,通过赋予它与包含的值进行模式匹配的可能性? – 2012-03-22 09:46:17
通过编写将一个monad转换为另一个monad的方法,或者执行一些操作。例如,Control.Monad.ST.stToIO'将'ST'计算转换为'IO'计算。 – 2012-03-22 10:08:02
晶莹剔透。谢谢你们俩! – 2012-03-22 10:33:23