如何映射具有异构元素类型的记录

How to map over a record with heterogeneous element types

我有一条记录要映射过来。记录元素属于异构类型但属于更高种类的类型

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

Higher-rank 这样的类型 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