假设我有数据类型
data Price = Price Double
data Book = Book {title :: String, bookPrice :: Price}
用函数提取数值价格
priceAsDouble :: Price -> Double
priceAsDouble (Price doubleValue) = doubleValue
现在,我想为图书列表上的折叠写一个累加器,例如
go :: Double -> Book -> Double
go acc book = acc + priceAsDouble (bookPrice book)
这很好,而且可以编译。
但是,如果我将最后一行更改为
go acc book = acc + priceAsDouble $ bookPrice book
我得到以下自相矛盾的编译器错误:
<interactive>:10:51:
Couldn't match expected type ‘Price -> Double’
with actual type ‘Double’
The first argument of ($) takes one argument,
but its type ‘Double’ has none
In the expression: acc + priceAsDouble $ bookPrice book
In an equation for ‘go’:
go acc book = acc + priceAsDouble $ bookPrice book
<interactive>:10:57:
Couldn't match expected type ‘Double’
with actual type ‘Price -> Double’
Probable cause: ‘priceAsDouble’ is applied to too few arguments
In the second argument of ‘(+)’, namely ‘priceAsDouble’
In the expression: acc + priceAsDouble
问题:我认为($)只是括号()的语法糖。显然,我错了。我脑子里的错误在哪里?
发布于 2015-09-13 14:35:42
$
是括号的语法糖,但它不适用于您所期望的级别。
go acc book = acc + priceAsDouble $ bookPrice book
实际上被解释为
go acc book = (acc + priceAsDouble) (bookPrice book)
但是acc + priceAsDouble
对于GHC来说是没有意义的。
具有讽刺意味的是,您需要更多的括号才能使其工作:
go acc book = acc + (priceAsDouble $ bookPrice book)
https://stackoverflow.com/questions/32550691
复制相似问题