问题标签 [algebraic-data-types]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
340 浏览

haskell - Haskell 的代数数据类型:“伪扩展”

我正在学习 Haskell 中的代数 DT。我想做的是创建一个新的 ADT 来“扩展”现有的 ADT。我找不到如何表达我想要的东西,有人可以提出替代模式或提出解决方案。我希望它们是不同的类型,但复制和粘贴就像一个愚蠢的解决方案一样接缝。下面的代码最好地描述了我正在寻找的东西。

编辑:我认为它需要一点澄清......我希望能够做到这一点(在 ghci 中)

并不是

0 投票
1 回答
429 浏览

haskell - Haskell 中的数据类型设计

你有什么建议:

然后我正在制作:

或者

取决于前面的答案。我有一个类型的功能Char -> Maybe Move

我应该将我的类型更改Move为:

? 该功能将变为:

我想知道这是因为列表不需要Maybe:

或者有没有办法Maybe让它变得更干净?

0 投票
2 回答
6040 浏览

haskell - Haskell 数据类型别名命名

Vector我在 Haskell 中编写了一个数学模块。

所以我开始了:

很好——这让我可以使用任何我想要的数字数据类型。问题是我不想到处写作DoubleVector Double原因很简单,我不应该这样做。所以我补充说:

但是当然第二行是错误的,因为现在有两个Vector. 那我应该把它改成什么?我对自己想,不,我将在我的代码中编写这个,所以我想将类型别名简单地保留为Vector. 这意味着我必须更改数据类型名称。但是如果我改变它,那么我觉得我也应该改变构造函数,这会让一切变得更加混乱。但是,如果以这种方式使构造函数与类型别名具有相同的名称,感觉很尴尬。

现在我有这个:

T是任意选择的(我猜它代表“类型”),但我对此不太确定。通常,当我记录函数时,我会说-- Calculate the magnitude of a Vector,但VectorT我觉得我真的应该使用那个类型名称。所以我只把它们称为vectors(不大写)——除非我觉得我必须将此约定应用于每种数据类型的每个注释。

有没有人遇到过类似的情况?在这种情况下,谁能想到更优雅的解决方案?

0 投票
4 回答
368 浏览

haskell - 具有零构造函数的代数数据类型有什么意义?

不幸的是,这段关于在 Haskell 中开发 ADT 的文章缺乏参考,来自A History of Haskell: Being Lazy With Class,第 5.1 节:

通常,代数类型指定一个或多个备选方案的总和,其中每个备选方案是零个或多个字段的乘积。允许零个替代项的总和可能是有用的,这将是一个完全空的类型,但当时这种类型的价值并不受欢迎。

让我想知道,这样的 ADT 有什么用?

0 投票
1 回答
857 浏览

haskell - 无法理解 Haskell 的类型系统

我目前正在尝试做20 个中级 Haskell 练习。我能够完成第 3 次练习(但这是因为furry==fmapLearn You a Haskell已经有了这些实现)。我目前被困在说:

我真的不明白该怎么做。在 Learn You Haskell 中,他们有一个newtype名为的变量Pair,它接受一个元组。然后他们可以像这样进行模式匹配:

我在想也许你可以在我的情况下做类似的事情:

但是,这不起作用:

我在想也许我会import Data.Either,因为他有一些我没有的进口东西。但这没关系。

我也试图让这个工作:

但这也不起作用:

我也无法让它工作:

这给出了错误:

我只能得到:

去工作。但我不知道该怎么办t

我不一定想要答案。我只需要一个关于该做什么的提示,因为我正在阅读并且我可以理解这些示例,但我无法真正开始自己编写这些东西。

谢谢丹,这就是我想出的解决方案:

0 投票
3 回答
2155 浏览

scala - Scala 和 Haskell 中的“复合”代数数据类型

在尝试用 Scala 中的代数数据类型描述 Sql 的一部分时,我遇到了创建表示数据类型的根特征的子特征的必要性。由于满足此要求产生了一个我不确定是否可以用 Haskell 的 ADT 表示的代码,并且由于与 Haskell 不同,ADT 不是 Scala 的本机构造,我现在想知道:

  1. 我是对的,在 Haskell 中不可能表示一个模型,例如一个Sql具有“子类型”的类型,并且在 HaskellStatement中有一个构造函数吗?(似乎可能是相关的)。Select
  2. 如果是这样,术语“ADT”是否适用于我生成的代码?
  3. 如果是的话,这是否使 Scala 在这方面实际上比 Haskell 更强大?
  4. 如果没有,这个功能没有在 Haskell 中实现的原因是什么?这让我觉得我的模型中的事情可能过于复杂

这是我正在谈论的模型:

0 投票
2 回答
776 浏览

haskell - 具有许多构造函数的 ADT 的 Haskell Zipper

我有一些 ADT 代表 Haskell 中的简单几何树。将我的操作类型与树形结构分开的事情让我很困扰。我正在考虑让 Tree 类型包含运算符的构造函数,看起来它会更干净。我看到的一个问题是我的 Zipper 实现必须改变以反映所有这些新的可能的构造函数。有没有办法解决?还是我错过了一些重要的概念?总的来说,我觉得我很难掌握如何在 Haskell 中构建我的程序。我了解大多数概念、ADT、类型类、单子,但我还不了解大局。谢谢。

0 投票
1 回答
60 浏览

database - 如何使用代数查询语言找到最小值

我需要找到这张桌子上卖的最便宜的本田思域

还有其他表,但我假设没有其他制造商将他们的品牌命名为 Civic。

因此,我正在寻找 Make Civic 的最低价格。但我究竟如何找到最低价格?我会知道是否有固定价格 ( SELECT the make WHEN price < "x amount"),但我要如何在表中找到最低价格。

0 投票
2 回答
1138 浏览

haskell - 为什么归纳数据类型禁止类型递归发生在 -> 前面的类型,如 `data Bad a = C (Bad a -> a)`?

Agda归纳数据类型和模式匹配手册说明:

为了确保归一化,感应事件必须出现在严格的正位置。例如,不允许使用以下数据类型:

因为在构造函数的参数中有一个负面的 Bad 出现。

为什么这个要求对于归纳数据类型是必要的?

0 投票
6 回答
966 浏览

java - Java中类似ADT的多态性(不改变类)

Haskell中,我可以定义以下数据类型:

然后像这样编写多态函数:

Java中,我可以使用接口模拟代数数据类型:

但是如果我尝试使用类似 Haskell 的多态性,我会得到一个错误:

克服这个问题的正确方法是将方法放在 depth() 每个类中。但是如果我不想把它放在那里怎么办?例如,方法depth()可能与类没有直接关系Tree,将其添加到类会破坏业务逻辑。或者,更糟糕的是,Tree可能是在我无法访问的 3rd 方库中编写的。在这种情况下,实现类似 ADT 的多态性的最简单方法是什么?

以防万一,目前我正在使用以下语法,这显然是不受欢迎的: