haskell具有不同字段名称的记录变体

时间:2012-02-15 01:29:14

标签: haskell record variant

鉴于此:

data Foo = Bar { name :: String } | Baz { nickname :: String }

namenickname这两项功能似乎都属于Foo -> String类型:

:t name
name :: Foo -> String

:t nickname
nickname :: Foo -> String

但是,定义不完整,因为以下两个表达式都会引发模式匹配错误:

name $ Baz { nickname = "Bob" }
nickname $ Bar { name = "Fred" }

是否可以完成namenickname的定义,例如:

name Baz { nickname = n } = ...

nickname Bar { name = n } = ...

在拥抱中尝试此操作会产生错误,例如“变量名称的多个声明”。

2 个答案:

答案 0 :(得分:5)

不,这是不可能的。字段名称是与范围有关的顶级函数,因此无法重新定义或扩展。将head作为一个整体功能是不可能的。

答案 1 :(得分:3)

尝试使用 - XDataKinds扩展名,它允许您将数据构造函数提升为种类。

请注意,您需要GHC 7.4.1,该版本仅在12天前发布。现在是提出这个问题的好时机!