如何使用异构元素类型映射记录

时间:2017-01-29 21:09:41

标签: purescript

我有一张我要映射的记录。记录元素属于异质类型,但具有较高的类型

data U a = U a
data V a = V a

data R a = R {x :: a Int, y :: a String }

fromU2V (U a) = V a

r1 = R { x: U 1, y: U "yo!" }

map f (R { x: x, y: y }) = R { x: f x, y: f y }

r2 = map fromU2V r1 
-- :type r2 => R V

我怎样才能完成这项工作?上面的代码在行上给出了一个错误

map f (R { x: x, y: y }) = R { x: f x, y: f y }
                                          ^^^

    Could not match type
        String
    with type
        Int

我假设函数f在这里被推断为特定类型

PS:代码在Purescript

1 个答案:

答案 0 :(得分:4)

通常无法推断出较高等级的类型,例如此map(至少现在不是这样)。我想你需要添加一个类型签名:

map :: forall f g. (forall a. f a -> g a) -> R f -> R g
map f (R { x: x, y: y }) = R { x: f x, y: f y }

或者,等效地使用Prelude:

中定义的NaturalTransformation type synonym
map :: forall f g. (f ~> g) -> R f -> R g