haskell - 为什么 Maybe 包括 Just?

标签 haskell optional

感谢 some excellent answers here ,我大致了解(以有限的方式清楚地)Haskell 的 Maybe 的目的并且它的定义是

data Maybe a = Nothing | Just a

但是我不清楚为什么Just是这个定义的一部分。据我所知,这是Just本身已定义,但相关文档对此并没有多说。

我是否正确认为使用 Just 的主要好处是在 Maybe 的定义中,而不是简单地
data Maybe a = Nothing | a

是它允许与 Just _ 进行模式匹配吗?对于有用的功能,如 isJustfromJust ?

为什么是 Maybe以前一种方式定义而不是后者?

最佳答案

Haskell 的代数数据类型是 标记工会 .按照设计,当您将两种不同的类型组合成另一种类型时,它们必须具有构造函数来消除它们的歧义。

您的定义不符合代数数据类型的工作方式。

data Maybe a = Nothing | a
a 没有“标签”这里。我们如何告诉 Maybe a除了正常的、未包装的 a在你的情况下?
Maybe有一个 Just构造函数,因为它必须具有设计的构造函数。

其他语言有union types它可以像你想象的那样工作,但它们不适合 Haskell。它们在实践中的表现不同,并且往往容易出错。

比起普通的联合类型,更喜欢带标签的联合有一些强有力的设计理由。它们在类型推断方面表现出色。实际代码中的联合通常有一个标签¹。而且,从优雅的角度来看,带标签的联合是 自然贴合 因为它们是 的对偶产品 (即元组和记录)。如果你很好奇,我在一篇博文中写过这个 introducing and motivating algebraic data types .

脚注

¹ 我在两个地方使用过联合类型:TypeScript 和 C。TypeScript 编译为动态类型的 JavaScript,这意味着它在运行时跟踪值的类型——基本上是标签。

C 没有,但在实践中,90% 的联合类型的使用要么有标签,要么有效地模拟结构子类型。我的一位教授实际上对联合在实际 C 代码中的使用方式进行了实证研究,但我不记得那是什么论文。

关于haskell - 为什么 Maybe 包括 Just?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058506/

相关文章:

haskell - 如何在现实世界中使用函数式编程?

haskell - 将 IO 回调转换为无限列表

Haskell:用 do-notation 定义 FoldM

regex - Powershell Regex - optional 命名组匹配

c++ - 为什么 make_optional 不适用于文件流?

haskell - 理解 State Monad 中的 state 参数

haskell - 无法加载 GHC.TypeLits 模块

java - 类型不匹配无法从类型 Optional<User> 转换为 User

ant - 在哪里可以找到丢失的 optional Ant 任务?

struct - 选项类型是否小于包装类型加上 boolean 值?