【发布时间】:2015-02-28 10:52:32
【问题描述】:
我在发这个之前检查了this 的帖子,但是那个帖子并没有真正解释为什么这不起作用。
foo :: (Num a, Show a) => a -> IO ()
foo 0 = print "Was zero"
foo x = print x
foo 2 -- prints 2
foo 5 -- prints 5
map foo [0..10] :: [IO ()] -- Doesn't print out numbers.
编辑:
bar 0 = foo 0
bar n = do
foo n
bar (n - 1)
我确实理解为什么这会返回[IO ()],但我不明白为什么在构建此列表时不会发生打印。至少,我希望我们会看到 first 由于延迟评估而发生 print 调用。
在创建此列表的过程中,为什么没有出现打印到屏幕的“副作用”? foo 函数在应用于列表的每个元素时是否实际未输入?如果评估 print 调用以获取 IO () 来构建列表,为什么不会发生副作用?
【问题讨论】:
-
你的
foo函数不接受这个函数头的任何参数。 -
您在编辑中的
bar函数不会返回[IO ()],而是返回IO ()。它打印所有输入(在 GHCI 中运行时),但它的返回类型绝对不是任何内容的列表,正如您通过查看它所看到的那样:任何地方都没有列表!
标签: haskell side-effects