我一直在阅读关于拥有null
而不是(例如)的(不便)便利的信息Maybe
。阅读本文之后,我相信使用Maybe
(或类似方法)会更好。但是,令我惊讶的是,所有“众所周知”的命令式或面向对象的编程语言仍在使用null
(这允许对可以表示“无”值的类型进行未经检查的访问),并且Maybe
大多数在函数式编程语言中使用。
作为示例,请看下面的C#代码:
void doSomething(string username)
{
// Check that username is not null
// Do something
}
这里有些难闻的气味...为什么我们要检查参数是否为null?我们不应该假设每个变量都包含对对象的引用吗?如您所见,问题在于,根据定义,几乎所有变量都可以包含空引用。如果我们可以决定哪些变量是“可为空的”而哪些则不是呢?这将节省我们调试和寻找“ NullReferenceException”时的工作量。想象一下,默认情况下,没有类型可以包含null引用。取而代之的是,您将明确声明变量只有在确实需要时才可以包含空引用。那就是Maybe背后的想法。如果您的函数在某些情况下会失败(例如,被零除),则可以返回Maybe<int>
,明确指出结果可能是整数,但也没有任何结果!这是选择Maybe而不是null的原因之一。如果您对更多示例感兴趣,那么我建议阅读这篇文章。
事实是,尽管存在使大多数类型默认为可空的缺点,但大多数OO编程语言实际上都可以做到这一点。这就是为什么我想知道:
- 您必须用
null
编程语言来实现什么样的参数Maybe
呢?完全有原因还是仅仅是“历史包bag”?
在回答此问题之前,请确保您了解null和Maybe之间的区别。
null
或它的概念是不存在的(IIRC Haskell是一个这样的例子)。
null
很长一段时间使用的语言编写的。丢掉它并不容易。