问题标签 [gadt]

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 回答
2406 浏览

f# - 与 F# 中的 Haskell GADT 和类型类最接近的是什么?

F# 是带有 OOP 的 ML。与 Haskell 广义代数数据类型和类型类最接近的是什么?

0 投票
2 回答
1531 浏览

haskell - 如何为具有非 * 类型幻像类型参数的 GADT 导出 Eq

例如,尝试编译以下代码

给出类型错误

我可以看到为什么这不起作用,但是有一些解决方案不需要我手动编写 Eq(和 Ord)实例吗?

0 投票
0 回答
176 浏览

haskell - 使用 GADT 构建具有不同节点类型和父子关系规则的树

我正在尝试使用 simplexml包为自定义 XML 结构构建 XML 生成器。这是一个示例 XML 片段:

在这个自定义 XML 中,有一些规则指定可以在每种元素下嵌套哪些元素。是否可以定义一个 GADT 来构建基于这些规则限制结构的 XML 片段?规则简单地列出了允许的父子关系类型(例如,Response 不能是任何其他元素的子元素,SendAnswer 可以是 Response 的子元素等)。

这是我走了多远:https ://gist.github.com/4104499

执行时,它输出:

但是,我觉得这种方法有很多缺点:

  1. MyXMLElement 的数据定义(第 31 行)将需要与有效父子关系一样多的行。在不同的实现中,可以只列出一个元素的合法子元素,并在运行时检查合法关系。我选择了这种方法(使用 GADT),以便无效的 XML 树在编译时是非法的。
  2. eval 给出的接口非常有限:不允许任意嵌套(即使遵循父子关系规则);它不允许根据需要添加 XML 属性。

我想知道这个问题是否适合使用 GADT 的解决方案。如果是,如何设计得更好?

0 投票
1 回答
946 浏览

ocaml - OCaml - GADT - 布尔表达式

我想知道是否有某种方法可以做到这一点:

这里的问题是我不能定义 BinOp 两次,而我想取决于参数的类型......

PS:“canonical”的意思是“表达式中包含的n个变量用0到(n-1)的整数表示”。这是一个不变量,我需要对我的某些功能强制执行。

0 投票
2 回答
235 浏览

haskell - 如何限制异构列表中的类型?

我目前正在尝试创建一个(某种)类型安全的 xml,例如嵌入到 Haskell 中的语法。最后,我希望实现这样的目标:

其中 group 和 item 是 kind Node :: [Arg t] -> [Node c] -> Node t。如果这没有任何意义,那很可能是因为我不知道自己在做什么:)

我现在的问题是如何使类型系统阻止我向Node. 例如Nodes 类型Grouponly 可能有类型参数,Arg1Arg2sItem可能有类型参数FooBar

我想底线问题是:我如何限制异构列表中的类型?


我试图实现的(用户)语法示例:

其中 (.:) 是在节点中设置参数的函数。这将表示具有一些包含两个项目的参数的组。

此外,还会有一些(伪)定义,例如:

我正在寻找一种通过类型检查器捕获使用错误的方法。

0 投票
1 回答
356 浏览

haskell - 如何使用函数依赖和存在量化来为我的类型删除不必要的参数

在我正在研究的 HLearn 库中,我有一些容器数据类型,如下所示:

问题是这种类型使用起来很尴尬,因为params并且model两者都是彼此唯一确定的:

所以如果我在指定类型时不必同时指定它们会更方便。编译器应该能够自动为我完成。

我解决这个问题的想法是创建一个使用存在量化的类型别名:

但这不起作用。如果我像平常一样创建一个Container'实例,一切正常:

但是当我使用我的Container类型时:

ghc 爆炸:

非法多态或限定类型:容器模型在“模型(ContainerParams params)(容器模型)”的实例声明中

我不知道这个错误信息是什么意思。是否有可能以某种方式修复我的解决方案以创建一种Container无需指定参数的类型?


编辑:我应该注意,将forall语句移动到Container'声明中似乎需要一堆unsafeCoerces,所以这似乎是一个糟糕的解决方案。

此外,我可以更改type Containerdata Container并让事情正常工作,但这需要我重新声明Conatiner'属于其中的所有实例,我不想这样做。我有许多遵循这种模式的不同类型,因此似乎应该有一种通用的方法来解决这个问题。

0 投票
1 回答
113 浏览

compilation - 为什么 GHC 不会以这个 GADT 模板 Haskell 模块终止?

我在使用模板 Haskell 生成 GADT 时遇到问题。问题是我无法让代码完全编译。加载文件时 GHCI 不会终止,并且 ghc 进程会使用尽可能多的内存和 cpu(2.4GB,50~70%)。

我试图做一个最小的例子,它仍然会发生。我是使用牛津符号 ( [| |]) 还是通过手动应用 TH 数据类型来构建函数都没有关系。考虑这个简单的模块:

我在用于 x64 的 Haskell 平台的 OSX Mountain Lion 上使用 GHC 7.4.2。

有谁知道为什么会这样?也许我错误地使用了一些代码?

0 投票
2 回答
762 浏览

haskell - 为什么 GADT/存在数据构造函数不能用于惰性模式?

今天,当我尝试在存在 GADT 构造函数上匹配时使用惰性模式时遇到编译器错误:

不能在惰性 (~) 模式中使用存在或 GADT 数据构造函数

为什么会有这个限制?如果允许的话,会发生什么“坏”的事情?

0 投票
2 回答
154 浏览

haskell - 如何在 Haskell 中定义 Lispy 数据类型?

我正在为 Coursera 的 AI 规划课程编写一个 Lispy PDDL 解析器。

如何在 Haskell 中定义 Lispy 数据类型?

0 投票
2 回答
542 浏览

haskell - 数据种类的问题

我创建了一个非常简单的示例,说明我在使用 GADT 和 DataKinds 时遇到的问题。我的实际应用程序显然更复杂,但这清楚地抓住了我的情况的本质。我正在尝试创建一个可以返回任何类型为 Test 的值(T1,T2)的函数。有没有办法做到这一点,或者我正在进入依赖类型的领域?这里的问题看起来很相似,但我无法从他们那里找到(或理解)我的问题的答案。我刚刚开始了解这些 GHC 扩展。谢谢。

类似问题 1

类似问题2

----这里是错误---- Test.hs:14:26: