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

haskell - Haskell 代数数据类型

对于 HTML 字体标签,我有以下内容:

我像这样构建一个:

我担心的是FontColor具有 FontAttribute 类型的数据/值构造函数需要 Color 类型作为参数。这意味着 Color 是任何类型标签的通用类型属性,并且特定标签具有特定的属性子集(在这种情况下,Font 具有 FontAttribute,可以是 Size、Face 或 FontColor)。有没有更清晰的方式来表达这一点,或者我的实现是否合理?

0 投票
7 回答
35540 浏览

haskell - 你如何在 Haskell 中表示一个图形?

使用代数数据类型在 haskell 中表示树或列表很容易。但是您将如何以印刷方式表示图形?看来你需要有指针。我猜你可能有类似的东西

这将是可行的。但是感觉有点脱钩;结构中不同节点之间的链接并不像列表中当前前一个和下一个元素之间的链接,或者树中节点的父节点和子节点之间的链接那样“感觉”那么牢固。我有一种预感,在我定义的图形上进行代数操作会受到通过标签系统引入的间接级别的阻碍。

主要是这种怀疑的感觉和对不雅的感觉促使我提出这个问题。在 Haskell 中定义图形是否有更好/更优雅的数学方式?还是我偶然发现了一些本质上很难/基本的东西?递归数据结构很不错,但这似乎是另一回事。与树和列表的自引用方式不同的自引用数据结构。就像列表和树在类型级别是自引用的,但图在值级别是自引用的。

那么到底发生了什么?

0 投票
2 回答
101 浏览

haskell - 记录没有无限类型错误

当我在 Haskell (GHC) 中定义类似的东西时,为什么没有列表样式的无限类型错误?

它编译时没有类型错误,但显然它是一个不可用的类型:我必须定义

foo = Broken "one" (Broken "two" (Broken "three"...

0 投票
4 回答
584 浏览

haskell - Haskell 中的“依赖可选”数据

考虑一个 DateTime 类型,其中日期必须存在,但以秒为单位的时间部分是可选的。如果有时间部分,则可能还有一个可选的毫秒部分。如果存在毫秒,也可能存在纳秒部分。

有很多方法可以解决这个问题,例如:

你会使用哪种结构(当然不限于上面的例子),为什么?

[意向]

我正在探索 Frege 中日期类型的可能性(http://code.google.com/p/frege/),使用 date4jDateTime作为指导方针(因为 Haskell 的日期和时间库太复杂了,java.util.Date太破碎了)。在我当前的玩具实现中,所有字段都是必需的,但当然最好将用户从不需要的精度中解放出来(并且原始实现具有可选字段)。

所以主要目标是:

  • 安全:必须不惜一切代价避免非法状态
  • 方便:使用类型应该很容易,例如模式匹配会很酷,日历计算应该很容易......

不那么重要的是:

  • 性能:当然,使用类型不应该太慢,但对于典型的用法,它不必挤出最后一个时钟周期
  • 内存:在这很重要的情况下,很容易推导出更紧凑的存储格式
  • 简洁的实现:这是一个库,我愿意添加使事情顺利进行所需的所有代码

也就是说,所有这些都是非常试探性的,不应该太认真。

0 投票
1 回答
199 浏览

haskell - Haskell - 请帮我简化这两个功能

我正在尝试在 48 小时内完成为自己编写计划中的练习。我需要帮助来简化几个功能。

isNumberisString函数有很多共同的结构。我该如何分解这种通用结构?

0 投票
2 回答
910 浏览

haskell - Haskell 代数数据类型模式匹配

我有以下内容:

我正在尝试定义一个函数,该函数将移动 Alpha Int 类型的 val 并将其求和。我想要的方法是提取所有 Ints,然后对结果列表求和,但我正在努力提取所有 Ints,因为我不知道如何处理递归......

轻微的尝试:

显然这不太有效,但我看不到解决方案。

0 投票
2 回答
468 浏览

scala - 如何在Scala中为树代数数据类型的叶子调用构造函数?

我正在创建一些基本的抽象数据类型和算法来复习我的 CS 基础知识,并在此过程中学习 Scala。我的 BinarySearchTree 数据类型遇到了麻烦,这是一个更抽象的 BinaryTree 的实现:

在抛出 NotDefinedErrors 的块中,我尝试了一些方法,例如l = new this.type(newval),替换this.type以及BinarySearchTree[T]我能想到的任何其他方法。根据我尝试表达该类型的方式,我会得到类似的东西:

或者:

我是否需要在 BinarySearchTree 的定义中用不同类型覆盖 l 和 r?或者只是在我为它们附加新值时调用不同类型的构造函数?还是其他选择?

0 投票
5 回答
2456 浏览

functional-programming - 代数数据类型的概念是否类似于 OO 语言中的类定义?

这两个概念都允许创建新的数据类型。我能看到的唯一区别是,在函数式语言中,可以对代数数据类型执行模式匹配。但是 OO 语言没有类似的简洁特性。这是一个准确的说法吗?

0 投票
2 回答
677 浏览

haskell - 具有编译器强制长度的 Haskell 多维数组

我一直在尝试一些 Haskell,因为我对强类型很感兴趣,但我对解决这个问题的最佳方法感到困惑:

Data.Vector 中定义的 Vector 数据类型允许通过嵌套数组的方式进行多维数组。但是,这些是由列表构成的,并且不同长度的列表被认为是相同的数据类型(与不同长度的元组不同)。

我如何扩展这种以相同方式起作用的数据类型(或编写类似的数据类型),除了不同长度的向量被认为是不同的数据类型,因此任何尝试创建具有不同长度行的多维数组/矩阵(对于例如)会导致编译时错误?

元组似乎通过写出 63 个不同的定义(每个有效长度一个)来管理这一点,但如果可能的话,我希望能够处理任意长度的向量。

0 投票
1 回答
356 浏览

haskell - GADT 或幻像类型对函数调用进行类型检查,但保持类型的同质性

我假设可以使用类型算术解决以下问题,但尚未找到解决方案。

问题

我有一个从字符串到值的有限映射(使用 Tries 作为实现),我从二进制/文本文件(json、xml、...)解析。

每个映射具有相同类型的值,但不同的键集。我将具有相同键集的映射分组在一起,以防止必须一直进行类型切换我有一个需要某些键的专用功能:

这使我可以编写如下内容:

代替

这可行,但有两个缺点:

  1. Object 的同构列表现在变得异构,即我不能再拥有一个列表 [Object]。
  2. 我需要编写很多样板来获取/设置属性:

    /li>

问题

  1. 有没有更好的方法来根据 ADT 的构造函数专门化函数?
  2. 我怎样才能重新获得拥有列表 [对象] 的能力?是否有专门的 Dynamic 版本只允许某些类型?我想过再次包装对象,但这会增加很多样板。例如,

    数据 TObject = TT1 T1 | TT2 T2 ...

我需要的是:

这样我就可以得出:

我查看了 HList 但我认为它不适合我的问题。特别是,因为 [Object] 中的类型顺序在编译时是未知的。

在我看来,这可以使用函数依赖/类型算术来解决,但我还没有找到一个好的方法。