【发布时间】:2012-07-04 14:47:18
【问题描述】:
我开始了我的 Grand Haskell Crusade (GHC :) ),我对 monads 和 IO 函数有点困惑。谁能简单解释一下这两个函数有什么区别?
f1 = do x <- [1,2]
[x, x+1] -- this is monad, right?
f2 = do x <- [1,2]
return [x, x+1]
结果是:
*Main> f1
[1,2,2,3]
*Main> f2
[[1,2],[2,3]]
【问题讨论】:
-
除了这些出色的答案之外,我想指出的是,您不能将
Monad类中的return与类C 命令式语言中的return关键字混淆。它们完全不同,但很多习惯于这些语言的人看到return并没有意识到它不会导致返回值,而是进行计算以返回该值在稍后进行评估时。作为一种函数式语言,Haskell 不需要任何类似于return语句的东西。 -
确实,Haskell 选择使用
return这个词,恕我直言,是一个巨大的错误。但由于向后兼容,现在没有回头路了! -
@DanBurton: 你总是可以做一个别名:)
do_not_return a = return a -
已经有一个别名适用于大多数 Monad 类型:
pure。 -
@JesseHallett "
pure" 也是一个坏名字。pure x意味着采用x并使其“纯”(如sin x采用x并返回x的正弦)。但实际上恰恰相反:它需要一个“纯”x。
标签: list haskell monads do-notation