问题标签 [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 回答
515 浏览

generics - Haskell 中的泛型类型转换

我正在尝试编写一个带有常规函数的箭头转换器,并将它们转换为抽象值的计算。如果我们有一个“源”箭头,

那么目标是让f处理提升的 [原文如此?] 抽象值类型,在这个例子中

然而,为了成功地实现这个箭头,需要提升一些类型,以便在任意深度拥有具有一些具体值和一些抽象值的异构数据结构。我最终做的是为常规的 haskell 构造函数添加特殊类型,例如,如果

然后我为元组构造函数 (,) 添加一个抽象表示,

并且g的代码被提升到 [展开一点],

AVEither 也需要这样做。这最终会成为很多案例。有没有一个很好的方法来解决这个问题?

我是 Haskell 新手,所以请给我发参考资料或半详细的解释;可能我读过的最接近的东西是 SYBR 论文(废弃你的样板革命)第 1-3 节。

非常非常感谢你!

0 投票
1 回答
467 浏览

haskell - Haskell - 双向类实例类型含义或 GADT 存在类型限定?

我有一个定义为(缩写)的 GADT,

编译器正确地抱怨它不能为 R 派生 Show。在这种情况下,我们知道 (Either ab) 属于 Show 类,但如果 b 属于 Show 类,我们不知道这是真的。错误信息是,

似乎需要能够限定存在类型,例如对存在类型 b 说“Show b => Show (D (Either ab))”,或者升级含义“(Show a, Show b) = > Show (Either ab)" 所以它是双向的。

非常感谢!

(请随意清理标题或描述。)

0 投票
4 回答
7541 浏览

data-structures - 什么是“sums-and-products”数据结构?

最近一篇关于 William Cook 的 Fusings 的博文提到:

关键是 Ensō 中的结构被整体视为图形,而不是单个值或传统的和乘积数据结构。

他指的是什么传统的 sum-and-products 数据结构?

0 投票
2 回答
1787 浏览

data-structures - 数据结构差异化,直觉构建

根据这篇论文,数据结构的差异化工作。

根据这个答案

微分,数据类型 D(记为 D')的导数是具有单个“洞”的 D 结构类型,即不包含任何数据的可区分位置。这惊人地满足了与微积分中的微分相同的规则。

规则是:

引用的论文对我来说有点太复杂了,无法获得直觉。这在实践中意味着什么?一个具体的例子会很棒。

0 投票
2 回答
3920 浏览

haskell - 在 Haskell 中覆盖 (==)

我有以下代数数据类型:

用简单的玩具语言表示表达式。

但是,因为我推导出 Eq,所以即使我想将其视为等于的表达式,Op Plus (Var "a") (Var "b)也不认为等于。Op Plus (Var "b") (Var "a")a+bb+a

如何(==)仅针对这些实例进行更改,而不必(==)为所有其他实例指定行为?

0 投票
2 回答
276 浏览

haskell - 从 CSV 构造数据类型实例

我有 CSV 数据(继承 - 这里没有选择),我需要使用它在 Haskell 中创建数据类型实例。解析 CSV 没有问题 - 教程和 API 比比皆是。

这是为我简化的精简测试用例生成的“显示”:

我可以进行读取以将此字符串转换为 JField 数据记录。我的 CSV 数据只是字段的值,所以上面 JField 对应的 CSV 行是:

我正在阅读这些作为字符串列表 ["cardNo", "str"]

所以 - 暴力破解“字符串表示”的确切格式很容易(但在 Haskell 中编写 Java 或 python 风格的字符串格式不是我的目标)。

我想过做这样的事情(第一个列表是静态的,第二个列表是读取文件 CSV):

导致

然后连接元组 - 明确地使用 ++ 或以一些更聪明的方式尚未确定。

这是我在教程之外的第一段简单代码,所以我想知道这是否是一种合理的 Haskellian 方式,或者有什么明显更好的方式来构建这一段:fname = "cardNo", ftype =“字符串”

不期待解决方案(这不是家庭作业,这是一个学习练习),而是批评或指导以更好地做到这一点。蛮力强制它会很容易,但会破坏我的目标,即学习

0 投票
5 回答
358 浏览

haskell - 在枚举上创建函数

我刚开始学习 Haskell。我想我已经掌握了基础知识,但我想确保我实际上也在强迫自己从功能上思考。

无论如何,我想做的事情是创建一个函数来映射每个“Dir”和它的对立面/inv。我知道我可以轻松地再继续这 3 行,但我不禁想知道是否有更好的方法。我尝试添加:

但显然你不能这样做。所以我的问题是:有没有一种方法可以生成其余的逆函数,或者有更好的方法来创建这个函数?

非常感谢。

0 投票
1 回答
293 浏览

haskell - 具有代数数据类型的 Haskell 类型类

我有一些代数数据类型 A、B 和 C,每个都实现了该类:

如果我创建一个新的代数数据类型:

有没有一种简单的方法让 D 实现 Dog 而不必再次为 A、B 和 C 重新定义每个实例?

谢谢

0 投票
4 回答
272 浏览

haskell - 是否有一个词表示“具有两个构造函数的非递归数据类型”?

有没有一个词描述数据类型

  1. 正好有两个构造函数;和
  2. 不是递归的吗?

即描述这些类型

但不包括这些类型

0 投票
2 回答
414 浏览

haskell - 在 Haskell 中通过整数参数化类型

我正在尝试制作一些 Haskell 类型,这些类型不是按类型而是按类型的元素(特别是整数)进行参数化。例如,R^2 中的(线性代数)向量和 R^3 中的向量是不同类型的对象。具体来说,我正在用 Haskell 编写一个 KD 树,我想用一个正整数参数化我的数据结构,因此 3-D 树和 4-D 树具有不同的类型。

我试图通过元组参数化我的树,但它似乎没有去任何地方(而且这似乎不太可能被推动,特别是因为看起来三元组或更大的东西甚至不是函子(和我不知道如何说,例如 HomogeneousTuple a => Functor a)。我想做这样的事情:

那会很好,或者类似的东西同样好

有人知道这些效果中的任何一个是否可行或合理吗?

谢谢-约瑟夫