在Edx Haskell课程中,Erik Meijer反复声明使用Maybe
类型进行失败的计算并不是应该做的事情; 相反,应该使用空列表.
我的理解是Maybe
类型是好事,我们应该使用它.但是,似乎列表可以模拟所有Maybe
可以建模的模型以及更多......那么为什么我们需要这种Maybe
类型呢?
GS *_*ica 17
然而,似乎列表可以模拟Maybe可以建模的所有内容
"和更多"是一个很好的使用理由Maybe
.作为列表的使用者,您需要能够处理零个,一个或多个值.作为a的消费者Maybe
,您只需要能够处理零个或一个值.因此,在多个值没有意义的情况下,使用它会更好,Maybe
这样您就可以静态地知道您不会获得无意义的值.
列表可以模拟任意数量的结果.另一方面,Maybe
模型只有一个结果或根本没有结果.
考虑以下功能:
f1 :: A -> [B]
f2 :: B -> [C]
f3 :: C -> [D]
f4 :: D -> [E]
Run Code Online (Sandbox Code Playgroud)
目前尚不清楚有多少元素f1
,f2
,f3
或f4
回报.那么如果你对它们进行排序会怎样?
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类型进行失败计算不是应该做的事情; 相反,应该使用空列表.
没有任何额外的客观推理,这只是个人偏好.我可以告诉每个人,这fmap
比map
我们应该做的更好.在这一点上,你要么相信我,要么提出问题.如果他在演讲中没有说清楚,请直接问他.