扩展现有记录类型
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_ab
和 Rec_abc
的函数:
add42 :: forall r. Rec_ab r -> Rec_ab r
add42 r = r { b = r.b + 42 }
如果我有记录类型:
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_ab
和 Rec_abc
的函数:
add42 :: forall r. Rec_ab r -> Rec_ab r
add42 r = r { b = r.b + 42 }