将类型构造函数应用于记录类型的组件

时间:2016-12-05 22:52:29

标签: haskell template-haskell

给定一个固定类型的构造函数T和一个记录类型R,是否有一种机制可以为记录类型创建一个声明,该声明的组件是R的组件,但是T应用于该类型。

例如,T为PostThreadMessage,R为

future

机制应该给出,

Maybe

或者可能,

data Foo {
  bar :: Int,
  baz :: Bool
}

其中data Foo { bar :: Maybe Int, baz :: Maybe Bool } 后缀被指定为参数。

1 个答案:

答案 0 :(得分:2)

您可以使用其他类型(通常是仿函数)对您的类型进行参数化,然后执行

data Foo f {
   bar :: f Int
   baz :: f Bool
}

他们使用Foo IdentityFoo Maybe。问题是Foo Identity没有为您{bar :: Int, baz :: Bool}提供{bar :: Identity Int, baz :: Identity Bool}f。它在语义上是等同的,但在实践中是一种痛苦,因为你必须从Identity中解开所有字段。

然而,优点是您可以编写Foo Identity上通用的方法,并且同时适用于Foo MaybeIdentity。您可以使用类型系列删除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]