问题标签 [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 投票
5 回答
2056 浏览

language-agnostic - 函数式语言之外的代数数据类型?

哪些不只是功能性的语言具有代数数据类型(或类似的东西)和模式匹配?我也对多范式语言感兴趣——我知道 Ocaml 和 F# 是添加了 OO 的 ML 方言,因此它们从 ML 继承了代数数据类型。

可以使用enums 和unions 来模拟它们(如在 C、C++、...更多?),但这很快就会变得麻烦和丑陋,如果您在模式匹配中忘记了一个案例,编译器也不会警告您或者(更可能,也更危险)当“以错误的方式”访问联合时,即Left当它实际上是一个值时你要求一个值的字段Right(你得到的是对发生的位的毫无意义的重新解释在那里)。

我听说Pascal 有类似标记联合的东西,而Cyclone 语言也支持标记联合。维基百科还提到了 Ada 和 Algol。还有其他语言吗?

(如果您从未听说过代数数据类型,您可以阅读“什么是函数式语言中的'模式匹配'?”的答案以获得出色的介绍)。

0 投票
3 回答
3817 浏览

haskell - 是否有使用代数数据类型或多态性的 OOP 抽象类的 Haskell 等价物?

在 Haskell 中,是否可以编写一个带有签名的函数,该函数可以接受两种不同(尽管相似)的数据类型,并根据传入的类型进行不同的操作?

一个例子可能会让我的问题更清楚。如果我有一个名为 的函数myFunction和两个名为MyTypeAand的类型MyTypeB,我可以定义myFunction它只能接受类型的数据MyTypeAMyTypeB作为其第一个参数吗?

在 OOP 语言中,您可以像这样编写我想要实现的目标:

我一直在阅读有关代数数据类型的文章,我认为我需要定义一个 Haskell类型,但我不确定如何定义它以便它可以存储一种或另一种类型,以及我如何在我的自己的功能。

0 投票
3 回答
1030 浏览

haskell - Haskell 数据类型使用良好实践

阅读“Real world Haskell”我发现了一些关于数据类型的有趣问题:

这种模式匹配和位置数据访问使您看起来在数据和对其进行操作的代码之间具有非常紧密的耦合(尝试向 Book 添加一些内容,或者更糟的是更改现有部分的类型)。

这在命令式(尤其是 OO)语言中通常是一件非常糟糕的事情……在 Haskell 中这不是一个问题吗? 来源 RWH 评论

实际上,在编写一些 Haskell 程序时,我发现当我对数据类型结构进行小的更改时,它会影响几乎所有使用该数据类型的函数。也许有一些数据类型使用的好习惯。如何最小化代码耦合?

0 投票
1 回答
3862 浏览

functional-programming - 在 Scheme 中定义新的数据类型

我首先需要提一下,我对 Scheme 很陌生,因此,以下问题可能没有太大意义。

在学校,我们已经定义了代数数据类型,它通常有一个空构造函数和一些内部/外部的构造函数。

在这种特殊情况下,我对制作BTree二叉树类型(可能是平衡的,在未来的迭代中)很感兴趣,我想要这样的东西,就是 Haskell 对待构造函数的方式。例如,我以前见过如何在 Scheme 中实现树但这不是我想要的。

我不想只是围绕列表制作一个包装器。我只是想写一些类似的东西:

然后让它知道我的意思:

然后,我将其定义为(假设left, right,key已定义):

另外,我欢迎有关正确缩进我的方案代码的建议...(请修改)

0 投票
2 回答
310 浏览

c++ - 在 C++ 中为代数结构矩阵使用类的开销

我正在使用 C++ 编写一些复杂的 FFT 算法,因此我需要实现四元数和 Hamilton-Eisenstein 码等代数结构。算法适用于该结构的二维数组。将它们实现为类的开销是多少?换句话说,我应该创建包含四元数类的 [M][N] 维度的数组,还是应该创建 [M][N][4] 数组并将 [4] 数组用作四元数?使用类更方便,但是创建 M*N 类并访问它们的方法而不是只使用数组 - 这不会有太多开销吗?我正在为大型图像处理编写算法,所以性能对我来说很重要。

0 投票
1 回答
1053 浏览

haskell - 代数数据类型的递归自下而上遍历

在 Haskell 中处理相当大的代数数据类型时,有一个特定的递归遍历没有通过折叠数据类型来捕获。例如,假设我有一个简单的数据类型来表示命题逻辑中的公式,并在它上面定义了一个折叠:

此递归方案为评估或查找文字等递归提供了简洁的答案:

但是,当我希望“扫描”数据类型时,它的表现并不好。在下文中, simp 是由必要的模式匹配定义的辅助函数:

当然,使用折叠定义简化会产生不正确的结果。例如,以下不等价:

像简化这样的递归的最佳解决方案是什么?我应该定义一个类似于折叠数据类型的通用遍历,还是有一个标准的递归模式来定义这些函数?

0 投票
1 回答
2644 浏览

haskell - Haskell“不是构造函数的可见字段”错误

我收到一个我不太明白的错误:

谁能解释我为什么会收到此错误以及如何修复它?

主文件

SomeModule.hs

另一个模块.hs

0 投票
3 回答
2535 浏览

c# - C# 中类型安全的可区分联合,或者:如何限制接口的实现数量?

首先,很抱歉这篇冗长的帖子。基本上,我的问题是:

我正在尝试在 C# 中重现以下 F# 可区分联合类型:

谁能提出比以下更简单的基于接口的解决方案?


我所有的算法都识别这三种关系类型,而且只有这些,所以我需要防止IRelation第三方(即其他程序集)进一步实现。

脚注:对某些人来说,如果我的接口和算法在面向对象/多态性方面是正确的,那么将第三方实现注入到我的算法方法中并不重要,只要接口是正确实施。这是一个有效的批评。但是,让我们暂时假设在这种情况下我更喜欢函数式编程风格而不是严格的面向对象。

到目前为止,我最好的想法是将所有上述类型声明为internal(即外人永远不会直接看到它们)并创建一个代理类型Relation,这将是第三方唯一可见的类型:

到目前为止一切都很好,但它变得更加复杂......

  • ...如果我为具体关系类型公开工厂方法:

    /li>
  • …每当我公开一个处理关系类型的算法时,因为我必须从/映射到代理类型:

    /li>
0 投票
2 回答
2221 浏览

clojure - Clojure 代数数据类型

我在clojure.contrib.typesdefadt中找到了宏。不幸的是,没有关于在 clojure 中使用 ADT 的有用文档。我用谷歌搜索了几个小时,发现了关于它的一小部分信息。clojure 中的 ADT 是什么?如何使用它们?任何信息都会有所帮助:)

0 投票
3 回答
414 浏览

haskell - Haskell 中的多态场景

我编写了以下 Haskell 程序来解释基本数学。除了数学运算符之外,我还想添加比较和布尔运算符。我的问题是我应该如何用可以处理or的Int东西替换出现的.IntBool

我考虑将Token类型扩展为具有三种类型的运算符,它们仅在函数的类型((Int -> Int -> Int)、、(Int -> Int -> Bool)和)上有所不同(Bool -> Bool -> Bool),但这似乎会导致在类型声明和模式匹配。有没有办法用类型类来做到这一点?