首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell中($)的混淆:示例($)没有明显地替换括号

Haskell中($)的混淆:示例($)没有明显地替换括号
EN

Stack Overflow用户
提问于 2015-09-13 14:29:36
回答 1查看 84关注 0票数 2

假设我有数据类型

代码语言:javascript
运行
复制
data Price = Price Double
data Book = Book {title :: String, bookPrice :: Price}

用函数提取数值价格

代码语言:javascript
运行
复制
priceAsDouble :: Price -> Double
priceAsDouble (Price doubleValue) = doubleValue

现在,我想为图书列表上的折叠写一个累加器,例如

代码语言:javascript
运行
复制
go :: Double -> Book -> Double
go acc book = acc + priceAsDouble (bookPrice book)

这很好,而且可以编译。

但是,如果我将最后一行更改为

代码语言:javascript
运行
复制
go acc book = acc + priceAsDouble $ bookPrice book

我得到以下自相矛盾的编译器错误:

代码语言:javascript
运行
复制
<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

问题:我认为($)只是括号()的语法糖。显然,我错了。我脑子里的错误在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-13 14:35:42

$是括号的语法糖,但它不适用于您所期望的级别。

代码语言:javascript
运行
复制
go acc book = acc + priceAsDouble $ bookPrice book

实际上被解释为

代码语言:javascript
运行
复制
go acc book = (acc + priceAsDouble) (bookPrice book)

但是acc + priceAsDouble对于GHC来说是没有意义的。

具有讽刺意味的是,您需要更多的括号才能使其工作:

代码语言:javascript
运行
复制
go acc book = acc + (priceAsDouble $ bookPrice book)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32550691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档