gpt4 book ai didi

haskell - 数据类型中的相同变量名称

转载 作者:行者123 更新时间:2023-12-01 12:09:18 25 4
gpt4 key购买 nike

为什么使用数据类型我不能为那些数据属性提供相同的内部属性名称?

这里我不能在多个数据中重用变量名val

不编译

data Product = Product {val::String}deriving (Show, Eq)
data Price = Price {val::Double}deriving (Show, Eq)
data Discount = Discount { val::Double }deriving (Show, Eq)

编译

data Product = Product {productVal::String}deriving (Show, Eq)
data Price = Price {priceVal::Double}deriving (Show, Eq)
data Discount = Discount { discountVal::Double }deriving (Show, Eq)

最佳答案

Why using data types I cannot give same inner attribute name for those Data attributes?

如果你定义了一个记录类型,你就隐含地构造了一个“getter”。如果您定义记录数据类型,例如:

data Product = Product { val :: String } deriving (Show, Eq)

然后 Haskell 将构造一个函数:

val :: Product -> String

获取 val给定的 Product对象。

如果您随后定义了一个新的记录数据类型:

data Price = Price { val :: Double } deriving (Show, Eq)

然后你定义了两个版本的val ,从而导致名称冲突。

DuplicateRecordFields扩展名

自 8.0.1 起,Glasgow Haskell 编译器 (GHC) 有一个扩展 DuplicateRecordFields 允许指定具有相同字段名称的两个记录数据类型。

使用相同的记录名进行模式匹配是没有问题的,或者我们构造记录的时候,例如:

productToPrice :: Product -> Price
productToPrice (Product {val = x}) = Price { val = 3 }

不会产生任何问题,因为 valProduct { val = x }显然是指 valProduct 中定义数据构造函数,和 valPrice { val = 3 }指的是valPrice数据构造器。

如果我们使用 val作为一个函数,它会产生歧义:

Prelude> val (Product "foo")

<interactive>:15:1: error:
Ambiguous occurrence ‘val’
It could refer to either the field ‘val’,
defined at <interactive>:1:25
or the field ‘val’, defined at <interactive>:2:21

我们可以添加函数的签名来指定哪个val我们想使用:

Prelude> (val :: Product -> String) (Product "foo")
"foo"

或指定 Product "foo" 的类型,我们得到了同样的效果:

Prelude> val (Product "foo" :: Product)
"foo"

给定val但是具有相同的类型,或者具有一些通用的含义,引入一个类型类可能会更好,从而定义 val在那里发挥作用。

关于haskell - 数据类型中的相同变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53466606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com