gpt4 book ai didi

haskell - 为什么 Maybe 包括 Just?

转载 作者:行者123 更新时间:2023-12-03 11:05:14 25 4
gpt4 key购买 nike

感谢 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com