【发布时间】:2016-12-06 22:03:22
【问题描述】:
给定一个固定类型构造函数 T 和一个记录类型 R,是否有一种机制可以为记录类型创建一个声明,该记录类型的组件是 R 的组件,但 T 应用于该类型。
例如,T 为 Maybe,而 R,
data Foo {
bar :: Int,
baz :: Bool
}
机制应该给予,
data Foo {
bar :: Maybe Int,
baz :: Maybe Bool
}
或者可能,
data FooOpt {
barOpt :: Maybe Int,
bazOpt :: Maybe Bool
}
Opt 后缀被指定为参数。
【问题讨论】:
-
你能用
data Foo f { bar :: f Int, baz :: f Bool },然后type FooOpt = Foo Maybe这样简单的方法来解决这个问题吗?还是需要不同类型的类型安全? -
不,我不能触摸原始类型。
-
你确定你不能概括原始类型,所以像 Alexis 建议的那样使用几乎同构的类型吗?否则,我想 Template Haskell 是你唯一的选择,但我想知道你为什么真的需要这个。
-
你真的需要一个正确的
data声明(在这种情况下没有办法绕过 TH),还是你只需要 某种同构的类型到修改后的@987654330 @?在这种情况下,单独使用泛型的解决方案可能是可能的(这当然需要R的Generic实例,但这不应该成为障碍)。 -
generics-sop 可以做类似的事情stackoverflow.com/questions/39020787/…