我有一张我要映射的记录。记录元素属于异质类型,但具有较高的类型
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
中答案 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