为什么我要使用Maybe而不是List?

Tsh*_*nga 4 haskell types list maybe

看到Maybe类型与null和singleton列表的集合是同构的,为什么当我只能使用列表来容纳缺席时,是否有人想要使用Maybe类型?

sep*_*p2k 14

因为如果你将一个列表与模式相匹配[]并且[x]这不是一个详尽的匹配,你会得到一个警告,强迫你添加另一个永远不会被调用的案例或忽略警告.

匹配一个Maybe反对NothingJust x不过是面面俱到.因此,如果您未能匹配其中一个案例,您将只会收到警告.

如果您选择的类型使得它们只能表示您实际可能生成的值,则可以依靠非详尽性警告来告诉您代码中您忘记检查给定案例的错误.如果您选择更多"许可"类型,您将始终必须考虑警告是代表实际错误还是仅仅是不可能的情况.

  • @Tshimanga虽然你可以*忽略这些警告,但编写完全超过其域名的函数通常很有用,特别是在使用面向公众的API(例如包)编写内容时; `Maybe`有助于编写具有语义意义的代码以实现此目的. (3认同)

小智 11

您应该努力获得准确的类型.也许表示只有一个值或没有值.许多命令式语言通过值null表示"无"的情况.

如果您选择列表而不是" 可能",那么您的所有功能都将面临获得包含多个成员的列表的可能性.可能其中许多只会被定义为一个值,并且必须在模式匹配时失败.通过使用Maybe,您可以完全避免一类运行时错误.


Ale*_*lec 8

在现有(和正确)答案的基础上,我将提到基于类类的答案.

不同的类型传达不同的意图 - 返回a Maybe a表示具有失败[a]可能性的计算,而可以表示非确定性(或者,更简单地说,多个可能的返回值).

这导致了这样一个事实,即不同的类型对于类型类具有不同的实例 - 并且这些实例迎合了类型传达的基本本质.Take Alternative和它的运算符(<|>)表示在给定的参数之间组合(或选择)的含义.

  • Maybe a 组合可能失败的计算只意味着采取第一个不是 Nothing
  • [a] 组合两个计算,每个计算都有多个返回值,这意味着将所有可能的值连接在一起.

然后,根据您的函数使用的类型,(<|>)行为会有所不同.当然,你可以说你不需要(<|>)或类似的东西,但是你错过了Haskell的一个主要优势:它是许多高级组合库.

作为一般规则,我们喜欢我们的类型尽可能贴合和直观.这样,我们就不会与标准库作斗争,而且我们的代码更具可读性.


dfe*_*uer 5

Lisp,Scheme,Python,Ruby,JavaScript等都设法只与一种类型相处,您可以在Haskell中用大和类型来表示。必须处理每个处理JavaScript(或任何其他值)的函数,以接收数字,字符串,函数,文档对象模型的一部分等,并在遇到意外情况时引发异常。使用Haskell等打字语言进行编程的人更喜欢限制可能发生的意外事件的数量。他们还喜欢使用类型来表达想法,使类型成为有用的(和经过机器检查的)文档。类型越接近表示预期的含义,它们就越有用。