gpt4 book ai didi

haskell - 具有两个以上选项的 Tuple 或 Either 的相反名称是什么?

转载 作者:行者123 更新时间:2023-12-02 00:22:41 25 4
gpt4 key购买 nike

有一个元组作为任意数量类型的乘积,并且有一个任一作为两种类型的和。任意数量类型的 Sum 的名称是什么,类似这样

data Thing a b c d ... = Thing1 a | Thing2 b | Thing3 c | Thing4 d | ...

有标准实现吗?

最佳答案

在我提出反对使用此类类型的建议之前,让我解释一些背景知识。

Either是和类型,对或二元组是乘积类型。和与积可以存在于任意多个基础类型(集合)上。然而,在 Haskell 中,只有元组具有开箱即用的各种大小。 Either另一方面,可以(任意)嵌套来实现: Either Foo (Either Bar Baz) .

当然,很容易定义例如类型Either3Either4等等,本着 3 元组、4 元组等的精神。

data Either3 a  b  c = Left     a |     Middle b     | Right     c
data Either4 a b c d = LeftMost a | Left b | Right c | RightMost d

...如果你真的想要的话。或者你可以找到一个库来做到这一点,但我怀疑你可以按照任何标准将其称为“标准”......

但是,如果您确实定义了自己的通用总和和乘积类型,那么它们将与结构上等效的任何类型完全同构,无论其定义在何处。这意味着您可以相对轻松地调整您的代码,以便与使用替代定义的任何其他代码进行交互。

此外,它甚至很可能是有益的,因为这样您可以为总和和乘积类型提供更有意义的描述性名称,而不是使用通用元组或任何一个。事实上,有些人建议使用自定义类型,因为它本质上增加了静态类型安全性。这也适用于非求和/乘积类型,例如:

employment :: Bool  -- so which one is unemplyed and which one is employed?

data Empl = Employed | Unemployed
employment' :: Empl -- no ambiguity

person :: (Name, Age)  -- yeah but when you see ("Erik", 29), is it just some random pair of name and age, or does it represent a person?

data Person = Person { name :: Name, age :: Age }
person' :: Person -- no ambiguity

— 上面,Person真正编码了产品类型,但附加了更多含义。您还可以newtype Person = Person (Name, Age) ,而且无论如何它实际上是相当等价的。所以我总是更喜欢漂亮且能体现意图的自定义类型。 Either也是如此和自定义总和类型。

所以基本上,Haskell 为您提供了使用非常干净和可读的语法快速构建您自己的自定义类型所需的所有工具,因此最好我们使用它时不要诉诸元组等原始类型。然而,很高兴了解这种同构,例如在泛型编程的上下文中。如果您想了解更多信息,可以在谷歌上搜索“废弃您的样板”和“模板化您的样板”以及“(数据类型)泛型编程”。

<小时/>

附注它们分别被称为 sum 和 Product 类型的原因是它们对应于 set-union (sum) 和 set-product。因此,产品类型 (a, b) 描述的集合中的值(或唯一实例,如果您愿意)的数量。是 a 中值的数量的乘积以及 b 中的值的数量。例如(Bool, Bool)正好有 2*2 个值:(True, True) , (False, False) , (True, False) , (False, True) .

但是Either Bool Bool有 2+2 个值,Left True , Left False , Right True , Right False 。所以它恰好是相同的数字,但显然一般情况并非如此。

但是当然这也可以说是关于我们的定制Person产品类型,所以同样,没有什么理由使用 Either和元组。

关于haskell - 具有两个以上选项的 Tuple 或 Either 的相反名称是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995903/

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