也许monad是什么?

时间:2014-08-31 03:15:42

标签: c# monads

我一直在阅读如何在C#中实现monad。在更多Haskell之类的实现中,例如描述here的实现,使用名为Just的类型来包装除“Nothing”之外的结果。这种类型只是一种便利,所以我们不必在代码中的任何地方继续说Maybe,或者它是否有其他我不理解的属性? Eric Lippert的implementation不使用名为Just的类型,而是返回Tainted<R>

1 个答案:

答案 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模式的相似之外,尝试比较两者并不是有用的。