给定一个固定类型的构造函数T和一个记录类型R,是否有一种机制可以为记录类型创建一个声明,该声明的组件是R的组件,但是T应用于该类型。
例如,T为PostThreadMessage
,R为
future
机制应该给出,
Maybe
或者可能,
data Foo {
bar :: Int,
baz :: Bool
}
其中data Foo {
bar :: Maybe Int,
baz :: Maybe Bool
}
后缀被指定为参数。
答案 0 :(得分:2)
您可以使用其他类型(通常是仿函数)对您的类型进行参数化,然后执行
data Foo f {
bar :: f Int
baz :: f Bool
}
他们使用Foo Identity
和Foo Maybe
。问题是Foo Identity
没有为您{bar :: Int, baz :: Bool}
提供{bar :: Identity Int, baz :: Identity Bool}
。f
。它在语义上是等同的,但在实践中是一种痛苦,因为你必须从Identity中解开所有字段。
然而,优点是您可以编写Foo Identity
上通用的方法,并且同时适用于Foo Maybe
和Identity
。您可以使用类型系列删除type family EraseIdentity f a where
EraseIdentity Identity a = a
EraseIdentity f a = f a
data Foo f = Foo {
bar :: EraseIdentity f Int
baz :: EraseIdentity f Bool
}
。
Identity a
类型系列是类型的函数,您在这里说的是,将a
转换为Foo Identity
。现在{ bar :: Int, baz :: Bool}
是RewriteRule ^(.*)/$ page.php?data=$1 [L]
。