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

标签 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 } = ...

在拥抱中尝试这个会产生诸如“变量名的多个声明”之类的错误。

最佳答案

不,这是不可能的。字段名称是关于范围的顶级函数,因此不能重新定义或扩展。使它们成为完整的功能就像使 head 成为一体一样。

关于具有不同字段名称的记录的 haskell 变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9286722/

相关文章:

list - 在线性时间内查找不在列表中的最小非负整数,仅使用列表

Delphi:记录中的字符串大于 255 个字符

types - OCAML 如何找到变体的下一个元素

c# - 如何在C#中声明嵌入式结构(如delphi中的嵌入式记录)?

c# - 如何在 CLR/托管 C++ 中实现变体类型?

vb6 - VB6-将变体转换为节点

haskell - 了解仅出现在返回类型中的类型变量

haskell - 流融合在 Haskell 中是如何工作的?

haskell - 如何根据 Yesod 应用程序构建程序

iphone - 将电压施加到 iPhone 的麦克风端口