Double
无法匹配类型
()
类型
(y :: Int )
为什么不可能?
我无法使用
5.0
并且不想重新创建记录
type Foo = {
x :: Int,
y :: Int
}
type Bar = {
x :: Int
}
foo :: Foo
foo = {x:1,y:2}
bar :: Bar
bar = foo
type Bar a = {
x :: Int | a
}
是唯一的选择吗?
使用bar = {x : foo.x}
可能会出现什么问题?
答案 0 :(得分:4)
如果你想编写函数处理只有一些特定字段的记录,那么你可以使用一个打开的行代替:
bar :: forall r. { x :: Int | r } -> { x :: Int | r }
bar rec = rec
这仍然与Foo
和Bar
同义词兼容。
但是,如果这也不好,你只想“忘记”关于y
那么unsafeCoerce
应该可以使用,只要你只强迫Foo
Bar
,而不是再回来。
我强烈建议别名unsafeCoerce
,而不是直接使用它:
forget :: Foo -> Bar
forget = Unsafe.Coerce.unsafeCoerce
即使您认为自己以原则方式使用它,也很容易在直接使用时出错。
就个人而言,我只是创建一个没有字段的新记录,即使它涉及一些样板。