【发布时间】:2018-08-11 14:53:15
【问题描述】:
考虑数据类型
data Foo f = Foo {fooInt :: f Int, fooBool :: f Bool}
我想要一个函数mapFoo :: (forall a. f a -> g a) -> Foo f -> Foo g。我的选择:
- 我可以手动编写。这有点烦人,但最重要的反对意见是我希望
Foo随着时间的推移会获得字段,并且我希望它尽可能地顺畅,因此必须为这个函数添加一个案例很烦人。 - 我可以编写Haskell 模板。我很确定这并不太难,但我倾向于将 TH 视为最后的手段,所以我希望有更好的东西。
- 我可以使用泛型吗?我派生了
Generic,但是当我尝试实现K1案例(特别是处理Rec0)时,我不知道该怎么做;我需要它来改变类型。 - 我错过了第四个选项吗?
如果有一种通用的方式来编写 mapFoo 而无需使用 Template Haskell,我很想知道!谢谢。
【问题讨论】:
标签: haskell metaprogramming generic-programming higher-kinded-types