我一直在阅读如何在C#中实现monad。在更多Haskell之类的实现中,例如描述here的实现,使用名为Just
的类型来包装除“Nothing
”之外的结果。这种类型只是一种便利,所以我们不必在代码中的任何地方继续说Maybe
,或者它是否有其他我不理解的属性? Eric Lippert的implementation不使用名为Just
的类型,而是返回Tainted<R>
。
答案 0 :(得分:2)
尽管在C#中将Just
声明为类,但从技术上讲它不是一种类型。在Haskell的说法中,Just
被称为数据构造函数;它会创建Maybe
类型的数据。同样,Nothing
也是一个数据构造函数。
在Haskell中,Maybe
用作简单的错误处理机制。 Just
表示包装的值是操作的结果,而Nothing
表示某种错误。作为一个基本的例子,Haskell有一个带有以下签名的函数(1):
lookup :: [(key, value)] -> key -> Maybe value
此lookup
函数获取(键,值)对和键的列表,并返回包含在Maybe
中的值。如果密钥存在,则关联的值将包含在Just
中,否则会返回Nothing
。
(1)我故意遗漏了与此讨论无关的细节。
来自Eric Lippert的文章中的 Tainted
看起来像Monad
的另一个例子,但与Maybe
monad完全不同。我认为除了monad模式的相似之外,尝试比较两者并不是有用的。