type Foo = {
x :: Int,
y :: Int
}
type Bar = {
x :: Int
}
foo :: Foo
foo = {x:1,y:2}
bar :: Bar
bar = foo
Run Code Online (Sandbox Code Playgroud)
无法匹配类型
()
与类型
(y ::整数)
为什么这不可能呢?
我不能使用
type Bar a = {
x :: Int | a
}
Run Code Online (Sandbox Code Playgroud)
而且不想重新创建记录
bar = {x : foo.x}
Run Code Online (Sandbox Code Playgroud)
是unsafeCoerce唯一的选择吗?
使用可能会有什么问题unsafeCoerce?
如果要编写函数处理仅具有某些特定字段的记录,则可以改用开放行:
bar :: forall r. { x :: Int | r } -> { x :: Int | r }
bar rec = rec
Run Code Online (Sandbox Code Playgroud)
这仍将是既兼容Foo和Bar同义词。
但是,如果没有良好的要么和你只想“忘记”有关y那么unsafeCoerce应该怎么运用,只要你永远只能裹胁Foo到Bar,并没有回来。
我强烈建议使用别名,unsafeCoerce而不是直接使用别名:
forget :: Foo -> Bar
forget = Unsafe.Coerce.unsafeCoerce
Run Code Online (Sandbox Code Playgroud)
直接使用它很容易犯错误,即使您认为自己是有原则地使用它也是如此。
就我个人而言,即使涉及一些样板,我也只会在没有字段的情况下创造新记录。