如何映射具有异构元素类型的记录
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
我有一条记录要映射过来。记录元素属于异构类型但属于更高种类的类型
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