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

Eri*_*ikR 3 haskell record variant

鉴于这种:

data Foo = Bar { name :: String } | Baz { nickname :: String }
Run Code Online (Sandbox Code Playgroud)

两者的功能namenickname似乎是类型Foo -> String:

:t name
name :: Foo -> String

:t nickname
nickname :: Foo -> String
Run Code Online (Sandbox Code Playgroud)

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

name $ Baz { nickname = "Bob" }
nickname $ Bar { name = "Fred" }
Run Code Online (Sandbox Code Playgroud)

是否有可能完成的定义namenickname,像IE的东西:

name Baz { nickname = n } = ...

nickname Bar { name = n } = ...
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*her 5

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