问题标签 [ghc-generics]

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

generics - 如何使用 GHC.Generics(或其他类似框架)构造泛型 Functor 实例?

我正在尝试学习 GHC 泛型。在查看了几个示例之后,我想尝试创建一个通用Functor实例(忽略 GHC 可以为我自动派生它们)。但是,我意识到我不知道如何使用泛型处理参数化数据类型,我看到的所有示例都是类似的*。这是可能的,如果是的话,怎么做?(我也对其他类似的框架感兴趣,比如 SYB。)

0 投票
0 回答
219 浏览

generics - 派生没有模板 haskell 的记录数据类型

所以,我一直在玩弄 GHC.Generics,它们很棒,但似乎有限/主要集中在生成实例上。

如果可能的话,我想做的是从另一个数据类型派生一个新的数据类型。

假设您有以下类型:

我想“免费”获得以下数据类型:

我考虑过的一种可能性是使用类型族,但是新数据必须与 Xpto 相同:

我开始认为这一切都不可能,而且我确信这有充分的理由。

注意 1:我知道这对于 Template Haskell 可能是可行的......只是想知道是否还有其他方法。

0 投票
0 回答
84 浏览

haskell - 使用 GHC.Generics 恢复类型定义

昨天我尝试回答这个关于数据类型表示的问题。使用 GHC.Generics。我可以恢复给出的示例问题的类型定义,例如:

使用派生Generic实例,默认实例(Modelable可以恢复其类型定义的事物类),以及ModelableText

我们可以确定undefined :: Artist具有Main.Artist给定前面类型声明的类型:

我用声明来表示类型,这样我们也可以攻击递归数据结构,比如

我们可以确定的是

到目前为止,我的代码涵盖了所有这些情况:

https://gist.github.com/Cedev/9857191

我们可以恢复类型应用程序中的类型吗?

现在我无法分辨应用于两种不同类型的类型之间的区别,例如[Track]String ~ [Char]。从Datatype实例中D我只能恢复外部类型,在这种情况下GHC.Types.[],我什至无法区分这两种类型。

对于 an 的类型,以下是可接受的输出Album,但效率低下:

因为我无法区分[Track]and String,所以我能得到的最接近的是这样的,它假定所有[]s 都包含Track,因为这是首先遇到的:

我们可以恢复声明中的类型变量吗?

更好的表示将共享 的定义[]。这将需要发现[]具有 kind* -> *并且其:构造函数的第一个参数的类型来自 的类型参数[]

*我们可以恢复和以外的事物的类型定义* -> *吗?

是否有可能恢复具有更多参数的事物的定义?

例如应该是哪个

是否有可能恢复具有更高阶种类的事物的定义?

这将是

0 投票
2 回答
231 浏览

haskell - 使用 GHC.Generics 限制泛型函数域

假设我有一个类型类:

for 的定义fixed非常简单,所以我使用以下方法推导出它GHC.Generics

我没有包含 for 的实例,因为拥有for void 类型GFixed U1的实例没有意义。Fixed我对Generics机械的理解不是很好——具体来说,是什么类型,什么M1意思K1。问题如下:我可以GFixed在类型级别进行限制,以便默认定义fixed不适用于递归类型吗?

例如,如果我写:

我收到一个类型错误:No instance for (GFixed V1)。我想为之类的东西获取类型错误instance Fixed [Int]

0 投票
1 回答
171 浏览

haskell - 枚举通用实例的所有值时无限递归

对于我的另一个答案,我编写了以下代码,为 enumerable提供了对角遍历 的实例(它从那里的版本略有更新,但使用相同的逻辑):UniverseGeneric

Omega可能与问题无关,但是问题的一部分。)

这适用于大多数类型,甚至是递归类型:

例子:

但请注意,上述类型都不是一开始就有递归构造函数!事实上(这就是问题所在),存在以下分歧:

我首先认为可能有一些与Omegas' 的评估顺序有关的东西,但是将左右部分交换成行(2)只会T7起作用,而T6失败,这是我所期望的正确行为。

我目前的怀疑是对universein line的调用(1)评估得太早了。例如,以下也有分歧,而列表中应该只有一个值,甚至不应该评估:

因此,唯一的实例 ,在 list 中T8 (T8 (...) ... )被评估,即使它不是必需的!我不知道这个效果是从哪里来的——它是递归使用它自己的实例吗?但是,为什么“右递归”类型的行为正确,而“左递归”类型 ( ) 却没有呢?UniverseT6T7

这是一个严格的问题吗?如果是这样,在代码的哪一部分?我的Universe实例?Generic? 以及如何解决?如果这很重要,我使用 GHC 7.6.3。

0 投票
1 回答
486 浏览

haskell - SYB(废弃你的样板)相对于 GHC 泛型的优势

与 GHC Generics 相比,是否有任何任务只有 SYB 才能完成,或者更容易完成?

0 投票
1 回答
89 浏览

haskell - 从另一个文件中声明的数据派生通用失败

我有这两个模块:

在尝试构建包含这两个文件的项目时,链接阶段的 ghc 会抛出几个如下所示的错误:(它们仅在 (.data+0XXXX) 部分不同)。

最后的信息是:

我用 ghc 7.8.3 和 7.6.3 进行了尝试,它们的行为都相似。

如果将所有代码放入一个模块中,我可以使此功能正常工作。

谁能解释一下,这里发生了什么?

0 投票
2 回答
130 浏览

haskell - 在没有样板的情况下从类型 `T a` 转换为 `T b`

所以,我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化

我有注释类型ST,还有一些功能f :: S -> T。我想在 Expr 值内使用我的转换将其Expr S转换为一个。Expr TfS

有没有办法使用 SYB 或泛型来做到这一点,并避免在每种情况下都进行模式匹配?这似乎是适合的事物类型。我只是对SYB不够熟悉,不知道具体的方法。

0 投票
2 回答
607 浏览

haskell - 派生函子实例,而不是最后一个类型参数

与我今天早些时候提出的这个问题有关。

我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化

我有 def 和 var 的具体实例,比如Defand Var

我想要的是自动派生fmap哪个作为第一个参数的函子运行。我想派生一个看起来像这样的函数:

当我使用 normalfmap时,我收到一条编译器消息,表明 fmap 正在尝试将其函数应用于最后一个类型参数,而不是第一个。

有没有一种方法可以导出所描述的函数,而无需编写一堆样板文件?我试过这样做:

但我收到以下错误:

我正在使用其他人的代码库,所以如果我不必在任何地方切换类型参数的顺序,那将是理想的。

0 投票
0 回答
142 浏览

haskell - 为 Text.PrettyPrint.Doc 派生 Typeable

我有一个 AST 类型,我想将它派生为 Typeable,这样我就可以对它进行 Scrap-your-boilerplate 泛型遍历。

但是,树使用Doc来自 pretty 包的 Text.PrettyPrint 库类型的消息进行注释。要派生 Typeable,需要有 的可类型实例Doc

这是我尝试过但失败的方法:

给出这个错误:

或者,我尝试派生我自己的实例:

这给出了这个错误:

难道我做错了什么?是否有一种标准方法可以为其他库中给出的类型派生可类型化?

问题是,实例并不是非常重要。我知道我的 AST 没有任何部分以递归方式存储在 Doc 值中。但是如果我没有那个实例,GHC 就会抱怨。