问题标签 [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.
generics - 如何使用 GHC.Generics(或其他类似框架)构造泛型 Functor 实例?
我正在尝试学习 GHC 泛型。在查看了几个示例之后,我想尝试创建一个通用Functor
实例(忽略 GHC 可以为我自动派生它们)。但是,我意识到我不知道如何使用泛型处理参数化数据类型,我看到的所有示例都是类似的*
。这是可能的,如果是的话,怎么做?(我也对其他类似的框架感兴趣,比如 SYB。)
generics - 派生没有模板 haskell 的记录数据类型
所以,我一直在玩弄 GHC.Generics,它们很棒,但似乎有限/主要集中在生成实例上。
如果可能的话,我想做的是从另一个数据类型派生一个新的数据类型。
假设您有以下类型:
我想“免费”获得以下数据类型:
我考虑过的一种可能性是使用类型族,但是新数据必须与 Xpto 相同:
我开始认为这一切都不可能,而且我确信这有充分的理由。
注意 1:我知道这对于 Template Haskell 可能是可行的......只是想知道是否还有其他方法。
haskell - 使用 GHC.Generics 恢复类型定义
昨天我尝试回答这个关于数据类型表示的问题。使用 GHC.Generics。我可以恢复给出的示例问题的类型定义,例如:
使用派生Generic
实例,默认实例(Modelable
可以恢复其类型定义的事物类),以及Modelable
Text
我们可以确定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* -> *
并且其:
构造函数的第一个参数的类型来自 的类型参数[]
。
*
我们可以恢复和以外的事物的类型定义* -> *
吗?
是否有可能恢复具有更多参数的事物的定义?
例如应该是哪个
是否有可能恢复具有更高阶种类的事物的定义?
这将是
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]
。
haskell - 枚举通用实例的所有值时无限递归
对于我的另一个答案,我编写了以下代码,为 enumerable提供了对角遍历 的实例(它从那里的版本略有更新,但使用相同的逻辑):Universe
Generic
(Omega
可能与问题无关,但是问题的一部分。)
这适用于大多数类型,甚至是递归类型:
例子:
但请注意,上述类型都不是一开始就有递归构造函数!事实上(这就是问题所在),存在以下分歧:
我首先认为可能有一些与Omegas
' 的评估顺序有关的东西,但是将左右部分交换成行(2)
只会T7
起作用,而T6
失败,这是我所期望的正确行为。
我目前的怀疑是对universe
in line的调用(1)
评估得太早了。例如,以下也有分歧,而列表中应该只有一个值,甚至不应该评估:
因此,唯一的实例 ,在 list 中T8 (T8 (...) ... )
被评估,即使它不是必需的!我不知道这个效果是从哪里来的——它是递归使用它自己的实例吗?但是,为什么“右递归”类型的行为正确,而“左递归”类型 ( ) 却没有呢?Universe
T6
T7
这是一个严格的问题吗?如果是这样,在代码的哪一部分?我的Universe
实例?Generic
? 以及如何解决?如果这很重要,我使用 GHC 7.6.3。
haskell - SYB(废弃你的样板)相对于 GHC 泛型的优势
与 GHC Generics 相比,是否有任何任务只有 SYB 才能完成,或者更容易完成?
haskell - 从另一个文件中声明的数据派生通用失败
我有这两个模块:
在尝试构建包含这两个文件的项目时,链接阶段的 ghc 会抛出几个如下所示的错误:(它们仅在 (.data+0XXXX) 部分不同)。
最后的信息是:
我用 ghc 7.8.3 和 7.6.3 进行了尝试,它们的行为都相似。
如果将所有代码放入一个模块中,我可以使此功能正常工作。
谁能解释一下,这里发生了什么?
haskell - 在没有样板的情况下从类型 `T a` 转换为 `T b`
所以,我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化
我有注释类型S
和T
,还有一些功能f :: S -> T
。我想在 Expr 值内使用我的转换将其Expr S
转换为一个。Expr T
f
S
有没有办法使用 SYB 或泛型来做到这一点,并避免在每种情况下都进行模式匹配?这似乎是适合的事物类型。我只是对SYB不够熟悉,不知道具体的方法。
haskell - 派生函子实例,而不是最后一个类型参数
与我今天早些时候提出的这个问题有关。
我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化
我有 def 和 var 的具体实例,比如Def
and Var
。
我想要的是自动派生fmap
哪个作为第一个参数的函子运行。我想派生一个看起来像这样的函数:
当我使用 normalfmap
时,我收到一条编译器消息,表明 fmap 正在尝试将其函数应用于最后一个类型参数,而不是第一个。
有没有一种方法可以导出所描述的函数,而无需编写一堆样板文件?我试过这样做:
但我收到以下错误:
我正在使用其他人的代码库,所以如果我不必在任何地方切换类型参数的顺序,那将是理想的。
haskell - 为 Text.PrettyPrint.Doc 派生 Typeable
我有一个 AST 类型,我想将它派生为 Typeable,这样我就可以对它进行 Scrap-your-boilerplate 泛型遍历。
但是,树使用Doc
来自 pretty 包的 Text.PrettyPrint 库类型的消息进行注释。要派生 Typeable,需要有 的可类型实例Doc
。
这是我尝试过但失败的方法:
给出这个错误:
或者,我尝试派生我自己的实例:
这给出了这个错误:
难道我做错了什么?是否有一种标准方法可以为其他库中给出的类型派生可类型化?
问题是,实例并不是非常重要。我知道我的 AST 没有任何部分以递归方式存储在 Doc 值中。但是如果我没有那个实例,GHC 就会抱怨。