扩展现有记录类型

Extending existing Record type

如果我有记录类型:

type Rec_ab = { a :: String, b :: Int }

我可以从中得到 类型,它是用 {c :: Boolean} 有效扩展的吗:{ a :: String, b :: Int, c :: Boolean }?

如果我吵架,我可以做到:

Row_ab = ( a :: String, b :: Int )

Rec_abc = { c :: Boolean | Row_ab }

但是如果我有记录Rec_ab这应该如何解决?我不知道从 Record -> Row 的方式。

一般情况下,你不能。

如果您需要那种可扩展性,您使用 Row_ab 的方法就足够了,但另一种可能的解决方案是对记录进行参数化,然后使用参数对其进行扩展:

type Rec_ab r = { a :: String, b :: Int | r }
type Rec_abc = Rec_ab ( c :: Boolean )

这还允许您编写适用于 Rec_abRec_abc 的函数:

add42 :: forall r. Rec_ab r -> Rec_ab r
add42 r = r { b = r.b + 42 }