有没有办法获得不安全的子记录?

ais*_*ais 2 purescript

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

gb.*_*gb. 5

如果要编写函数处理仅具有某些特定字段的记录,则可以改用开放行:

bar :: forall r. { x :: Int | r } -> { x :: Int | r }
bar rec = rec
Run Code Online (Sandbox Code Playgroud)

这仍将是既兼容FooBar同义词。

但是,如果没有良好的要么和你只想“忘记”有关y那么unsafeCoerce应该怎么运用,只要你永远只能裹胁FooBar,并没有回来。

我强烈建议使用别名,unsafeCoerce而不是直接使用别名:

forget :: Foo -> Bar
forget = Unsafe.Coerce.unsafeCoerce
Run Code Online (Sandbox Code Playgroud)

直接使用它很容易犯错误,即使您认为自己是有原则地使用它也是如此。

就我个人而言,即使涉及一些样板,我也只会在没有字段的情况下创造新记录。