【发布时间】:2011-10-17 12:49:43
【问题描述】:
在玩 monad 时,我经常遇到求值问题。现在,我了解了惰性求值的基本概念,但我不明白在 Haskell 中如何对 monad 进行惰性求值。
考虑下面的代码
module Main where
import Control.Monad
import Control.Applicative
import System
main = print <$> head <$> getArgs
在我看来,主函数应该打印第一个控制台参数,但事实并非如此。
我知道
getArgs :: IO [String]
head <$> getArgs :: IO String
print <$> (head <$> getArgs) :: IO (IO ())
main :: IO (IO ())
很明显,第一个参数没有打印在标准输出上,因为第一个 monad IO 的内容没有被评估。所以如果我加入这两个单子,它就会起作用。
main = join $ print <$> head <$> getArgs
有人能帮我澄清一下吗? (或给我指点)
【问题讨论】:
标签: haskell monads lazy-evaluation