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

haskell - 将函数映射到代数数据类型的字段的更简洁的方法?

我有一个包含很多字段的数据类型:

问题一

如何将函数映射到每个字段,同时避免map为每个字段实现一个函数。例如,这看起来非常乏味且不习惯:

我认为某种抽象出模式的高阶函数constructor . (mapfunction f)会减少样板文件,但是有更好的解决方案吗?

问题二

如果我想将许多 ManyFields 压缩在一起并将任意数量的函数映射到每个字段上,这听起来像是某种类型类的实例吗?

用例:

它对我来说有点像一个应用程序,但我再次不确定如何fmap在这种类型上实现。

0 投票
2 回答
1257 浏览

haskell - Ordered variant types and subtypes in OCaml

I'm currently trying to do some mahjong hand processing in OCaml and straight from the beginning I'm confronted with something that bugs me.

I'll give you examples based on cards because I don't want to confuse anyone with mahjong terminology.

Just like in this part on User-Defined Types from OCaml for the Skeptical, I want to use variant types to describe suits, cards, and everything.

And it would be really nice if I could write a smart compare function that would understand ordered variant types.

Ideally I'd write something like that:

So that when I do

it gives me

Alas, the ocaml toplevel returns

(which is already quite good!)

Basically I want a compare function that would take hints from the type declaration structure.

I've read this article on polymorphic compare and this similar question but I'm not sure I want to depend on compare_val.

Do I really have to write my own compare function? If you recommend me to write one, do you have tips on the way it should be written, especially to reduce the number of cases?

P.S.: I just heard about deriving(Ord) in Haskell... Might be enough for me to take the leap...

0 投票
2 回答
262 浏览

haskell - 将数据类型转换为地图

我想将我的数据类型 Exp 转换为一个映射,其中函数名称(加、减等)是键,值是它们在表达式中出现的次数。这是我的数据声明:

我可以用 BST 来解决这个问题,但我似乎无法用不同的数据类型来完成这个任务。如果有帮助,这是我的 BST 解决方案:

完成上述程序后似乎应该很简单,但我什至不知道从哪里开始。注意:我想尽可能多地使用递归。提前致谢!

0 投票
4 回答
973 浏览

haskell - 在 Haskell 中为部分应用类型创建数据构造函数

是否可以在 Haskell 中为部分应用类型创建数据构造函数?

ghci 会话:

我想为 T1 类型创建数据构造函数-甚至可能吗?还是我必须使用新类型,因为无法手动定义这样的功能?

0 投票
1 回答
136 浏览

haskell - 声明后向数据类型添加新的构造函数

我需要在加载模块后向数据类型添加一些新的构造函数。伪代码可能看起来像这样:

在上面的例子MyType中,前面已经定义了MyModule。有没有办法做到这一点?

0 投票
1 回答
105 浏览

haskell - 可用于 Haskell 中的库的外部模块

这将是一个非常不寻常的问题,但我正在以一种非常特殊的方式生成 Haskell 代码,所以我知道我正在尝试做的事情听起来可能是一种反模式。

让我们说:

  1. 我们有图书馆LALB
  2. LA由模块组成A,库LB由模块组成B
  3. 每个模块定义DataType(分别DADB
  4. 我们有一个模块X它只包含定义TypeClass TX
  5. DA和都是DB_TX

我正在生成LALB在单独的步骤中,它们彼此不知道,因此该模块X不能成为其中任何一个的一部分。(DA并且DB简单地共享定义在 中的通用函数TX)。

我想问你是否可以将模块与X库分开?LALB

我是否必须制作X单独的库 ( LX) 或者有一种方法可以告诉 HaskellDA并且DB只是相同 TypeClass X的实例。

制作一个单独的库X(只包含一个库TypeClass对我来说似乎有点过头了,但在这种情况下,不可能有更好的解决方案)。

0 投票
2 回答
142 浏览

haskell - haskell - 对于非特定形式的代数数据类型,模式匹配会更快吗?

我有以下类型:

以及与以下模式匹配的函数:

即使Empty Empty里面(Branch rly 0 Empty Empty _)是唯一可能的情况,我想知道 - 将表格概括为:

工作更快(甚至可以忽略不计),因为运行时不需要匹配lrl和?lrrEmpty

0 投票
0 回答
385 浏览

matlab - Matlab ode求解器代数计算

我有一个在 Matlab 中编码为函数的 ODE 模型。随着时间的推移,我使用 ode15s 集成了 ODE。求解器完成后,我以代数方式计算一个新变量,它是模型输出的其他变量之和的一小部分。

例如:

这将被集成并返回 dA、dB、dC 的列数组。根据我计算的输出:

整个时间课程),并绘制这个值向量与时间的关系。

但是,我还需要对模型执行敏感性分析,为此我使用了Mathworks 存储库中修改后的 ODE15 。我需要能够将上面的“model_result”设置为灵敏度计算的目标函数。

我试图在函数内部计算 model_result,并将其作为另一个变量返回,但显然这不起作用,因为积分器返回积分值,而不是代数计算的值。

Matlab 中的 ODE 求解器是否可以返回代数值?

如果没有,有人知道如何进行这种敏感性分析吗?

谢谢你的帮助。如果我使用了所有错误的术语,我对建模很抱歉!

0 投票
2 回答
2140 浏览

database - 是否有使用代数数据类型的 Haskell 数据库?

我在业余时间用 Haskell 编写一个词汇训练器。

我有一个文件,其中条目被建模为代数数据类型,看起来像

最常见的是德语翻译_deu=_satz=通常只是一个我想在程序中更新的空字符串。

现在我有几个问题: 1. 是否有使用 Haskell 数据类型的数据库(我也非常希望数据库中的类型安全)?我发现的东西是 HDBC 与 MySQL 等的绑定,以及其他一些 xml/JSON 的东西。

  1. 如果我更新文件而不是使用数据库,有没有办法重新编译整个程序 - 这样做会有点乏味。

第三个问题

我想将学习的词汇保存在需要经常更新的数据结构中,因为在每个学习步骤中,我都会更新一个表示该单词知识的数字 - 并在插入/或之后对该数据结构进行排序。然后我根据它在这个数据结构中的位置选择一个新词。列表似乎对于进行完整的列表遍历效率低下,如果有更好的解决方案,排序是一项很大的工作。最后一个注释我确实只有 5000 个列表条目,所以可能是担心速度在错误的地方?

0 投票
1 回答
294 浏览

haskell - 数据上的所有约束都可以表示为代数数据类型吗?

数据和状态的所有约束都可以表示为代数数据类型吗?

我喜欢我经常能够将系统约束表达为 ADT 的方式。

即 ADT 的所有可能值都是系统的可能状态,没有不一致的余地。

是否总是如此,或者是否存在不能表示为 ADT 的约束?

(换句话说,当我无法将一组约束表示为 ADT 时,仅仅是我不够努力,还是某些类型的约束无法通过 ADT 执行?)

有这方面的数学证明吗?


更新:

这是一个玩具问题:

(roguelike)2D 地图由方形单元组成,每个单元都有一种材料(岩石或空气)。

每个单元格有四个边界(N、S、E 和 W)。每个边界由两个单元共享。

仅当一侧是岩石而另一侧是空气时,边界才可以选择包含“墙特征”。

(墙壁特征可以是杠杆、图片、按钮等)

只有当一侧是岩石而另一侧是空气时,什么 ADT 设计才能有一个存储墙壁特征的地方?即数据结构不能表示两个空气单元或两个岩石单元之间边界上的壁特征。