问题标签 [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.
f# - 与 F# 中的 Haskell GADT 和类型类最接近的是什么?
F# 是带有 OOP 的 ML。与 Haskell 广义代数数据类型和类型类最接近的是什么?
haskell - 如何为具有非 * 类型幻像类型参数的 GADT 导出 Eq
例如,尝试编译以下代码
给出类型错误
我可以看到为什么这不起作用,但是有一些解决方案不需要我手动编写 Eq(和 Ord)实例吗?
haskell - 使用 GADT 构建具有不同节点类型和父子关系规则的树
我正在尝试使用 simplexml
包为自定义 XML 结构构建 XML 生成器。这是一个示例 XML 片段:
在这个自定义 XML 中,有一些规则指定可以在每种元素下嵌套哪些元素。是否可以定义一个 GADT 来构建基于这些规则限制结构的 XML 片段?规则简单地列出了允许的父子关系类型(例如,Response 不能是任何其他元素的子元素,SendAnswer 可以是 Response 的子元素等)。
这是我走了多远:https ://gist.github.com/4104499
执行时,它输出:
但是,我觉得这种方法有很多缺点:
- MyXMLElement 的数据定义(第 31 行)将需要与有效父子关系一样多的行。在不同的实现中,可以只列出一个元素的合法子元素,并在运行时检查合法关系。我选择了这种方法(使用 GADT),以便无效的 XML 树在编译时是非法的。
- eval 给出的接口非常有限:不允许任意嵌套(即使遵循父子关系规则);它不允许根据需要添加 XML 属性。
我想知道这个问题是否适合使用 GADT 的解决方案。如果是,如何设计得更好?
ocaml - OCaml - GADT - 布尔表达式
我想知道是否有某种方法可以做到这一点:
这里的问题是我不能定义 BinOp 两次,而我想取决于参数的类型......
PS:“canonical”的意思是“表达式中包含的n个变量用0到(n-1)的整数表示”。这是一个不变量,我需要对我的某些功能强制执行。
haskell - 如何限制异构列表中的类型?
我目前正在尝试创建一个(某种)类型安全的 xml,例如嵌入到 Haskell 中的语法。最后,我希望实现这样的目标:
其中 group 和 item 是 kind Node :: [Arg t] -> [Node c] -> Node t
。如果这没有任何意义,那很可能是因为我不知道自己在做什么:)
我现在的问题是如何使类型系统阻止我向Node
. 例如Node
s 类型Group
only 可能有类型参数,Arg1
但Arg2
sItem
可能有类型参数Foo
和Bar
。
我想底线问题是:我如何限制异构列表中的类型?
我试图实现的(用户)语法示例:
其中 (.:) 是在节点中设置参数的函数。这将表示具有一些包含两个项目的参数的组。
此外,还会有一些(伪)定义,例如:
我正在寻找一种通过类型检查器捕获使用错误的方法。
haskell - 如何使用函数依赖和存在量化来为我的类型删除不必要的参数
在我正在研究的 HLearn 库中,我有一些容器数据类型,如下所示:
问题是这种类型使用起来很尴尬,因为params
并且model
两者都是彼此唯一确定的:
所以如果我在指定类型时不必同时指定它们会更方便。编译器应该能够自动为我完成。
我解决这个问题的想法是创建一个使用存在量化的类型别名:
但这不起作用。如果我像平常一样创建一个Container'
实例,一切正常:
但是当我使用我的Container
类型时:
ghc 爆炸:
非法多态或限定类型:容器模型在“模型(ContainerParams params)(容器模型)”的实例声明中
我不知道这个错误信息是什么意思。是否有可能以某种方式修复我的解决方案以创建一种Container
无需指定参数的类型?
编辑:我应该注意,将forall
语句移动到Container'
声明中似乎需要一堆unsafeCoerce
s,所以这似乎是一个糟糕的解决方案。
此外,我可以更改type Container
为data Container
并让事情正常工作,但这需要我重新声明Conatiner'
属于其中的所有实例,我不想这样做。我有许多遵循这种模式的不同类型,因此似乎应该有一种通用的方法来解决这个问题。
compilation - 为什么 GHC 不会以这个 GADT 模板 Haskell 模块终止?
我在使用模板 Haskell 生成 GADT 时遇到问题。问题是我无法让代码完全编译。加载文件时 GHCI 不会终止,并且 ghc 进程会使用尽可能多的内存和 cpu(2.4GB,50~70%)。
我试图做一个最小的例子,它仍然会发生。我是使用牛津符号 ( [| |]
) 还是通过手动应用 TH 数据类型来构建函数都没有关系。考虑这个简单的模块:
我在用于 x64 的 Haskell 平台的 OSX Mountain Lion 上使用 GHC 7.4.2。
有谁知道为什么会这样?也许我错误地使用了一些代码?
haskell - 为什么 GADT/存在数据构造函数不能用于惰性模式?
今天,当我尝试在存在 GADT 构造函数上匹配时使用惰性模式时遇到编译器错误:
不能在惰性 (~) 模式中使用存在或 GADT 数据构造函数
为什么会有这个限制?如果允许的话,会发生什么“坏”的事情?
haskell - 如何在 Haskell 中定义 Lispy 数据类型?
我正在为 Coursera 的 AI 规划课程编写一个 Lispy PDDL 解析器。
如何在 Haskell 中定义 Lispy 数据类型?