有没有办法在没有unsafeCoerce的情况下获得子记录?

时间:2016-03-27 08:43:12

标签: purescript

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} 可能会出现什么问题?

1 个答案:

答案 0 :(得分:4)

如果你想编写函数处理只有一些特定字段的记录,那么你可以使用一个打开的行代替:

bar :: forall r. { x :: Int | r } -> { x :: Int | r }
bar rec = rec

这仍然与FooBar同义词兼容。

但是,如果这也不好,你只想“忘记”关于y那么unsafeCoerce应该可以使用,只要你只强迫Foo Bar,而不是再回来。

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

forget :: Foo -> Bar
forget = Unsafe.Coerce.unsafeCoerce

即使您认为自己以原则方式使用它,也很容易在直接使用时出错。

就个人而言,我只是创建一个没有字段的新记录,即使它涉及一些样板。