空列表vs可能代表Haskell中的失败计算

use*_*545 7 haskell maybe

Edx Haskell课程中,Erik Meijer反复声明使用Maybe类型进行失败的计算并不是应该做的事情; 相反,应该使用空列表.

我的理解是Maybe类型是好事,我们应该使用它.但是,似乎列表可以模拟所有Maybe可以建模的模型以及更多......那么为什么我们需要这种Maybe类型呢?

GS *_*ica 17

然而,似乎列表可以模拟Maybe可以建模的所有内容

"和更多"是一个很好的使用理由Maybe.作为列表的使用者,您需要能够处理零个,一个或多个值.作为a的消费者Maybe,您只需要能够处理零个或一个值.因此,在多个值没有意义的情况下,使用它会更好,Maybe这样您就可以静态地知道您不会获得无意义的值.

  • 列表是非常成功的计算的最佳选择,它们返回多个值:-) (4认同)

Zet*_*eta 8

列表可以模拟任意数量的结果.另一方面,Maybe模型只有一个结果或根本没有结果.

考虑以下功能:

f1 :: A -> [B]
f2 :: B -> [C]
f3 :: C -> [D]
f4 :: D -> [E]
Run Code Online (Sandbox Code Playgroud)

目前尚不清楚有多少元素f1,f2,f3f4回报.那么如果你对它们进行排序会怎样?

f  :: A -> [E]
f s = f1 s >>= f2 >>= f3 >>= f4
Run Code Online (Sandbox Code Playgroud)

结果应包含多少个元素?一?零?我们是否意外地创建了一个包含n ^ n(n~输入长度)元素的列表?

但是,如果计算完全返回一个值或根本没有值,则正确的类型会立即为我们提供所有必要的信息:

f1 :: A -> Maybe B
f2 :: B -> Maybe C
f3 :: C -> Maybe D
f4 :: D -> Maybe E

f  :: A -> Maybe E
f s = f1 s >>= f2 >>= f3 >>= f4
Run Code Online (Sandbox Code Playgroud)

就是这样.现在回到Meijer的声明:

Erik Meijer反复声明,使用Maybe类型进行失败计算不是应该做的事情; 相反,应该使用空列表.

没有任何额外的客观推理,这只是个人偏好.我可以告诉每个人,这fmapmap我们应该做的更好.在这一点上,你要么相信我,要么提出问题.如果他在演讲中没有说清楚,请直接问他.