首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >美元运算符($)是否被认为是不好的形式?为什么?

美元运算符($)是否被认为是不好的形式?为什么?
EN

Stack Overflow用户
提问于 2011-12-24 01:14:22
回答 1查看 656关注 0票数 17

在Haskell中,我经常用$'s写表达式,我觉得它很自然,很容易读懂,但我有时会读到它是不好的形式,不明白为什么它应该是这样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-24 01:25:32

以下都是很好的形式:

代码语言:javascript
复制
foo = bar . baz . quux
foo x = bar . baz . quux $ x
foo x = (bar . baz . quux) x
foo x = bar (baz (quux x))

我已经按照我的喜好对它们进行了粗略的排序,尽管一如既往,品味各不相同,而且上下文可能需要不同的选择。我偶尔也会看到

代码语言:javascript
复制
foo = bar
    . baz
    . quux

barbazquux子表达式中的每个都很长时。以下是错误的格式:

代码语言:javascript
复制
foo x = bar $ baz $ quux $ x

有两个原因,这是不可取的。首先,在重构过程中,可以复制和粘贴到辅助定义中的子表达式更少;对于所有($)运算符,只有包含x参数的子表达式才是有效的重构,而使用(.)($)运算符,甚至可以将bar . bazbaz . quux等子表达式提取到单独的定义中。

选择(.)的第二个原因是预期($)的固定性可能会发生变化;目前,($)infixr,这意味着它与右侧关联,如下所示:

代码语言:javascript
复制
foo x = bar $ (baz $ (quux $ x))

但是,如果($)infixl,那么它在更多的表达式中会很有用;例如,如下所示

代码语言:javascript
复制
foo h = f (g x) (h y)
foo h = f $ g x $ h y
foo h = (f $ g x) $ h y

...which当前不能在没有括号的情况下表示。在使用infixl应用程序进行解析时,“糟糕的格式”示例如下

代码语言:javascript
复制
foo x = ((bar $ baz) $ quux) $ x

这意味着一些明显不同的东西。因此,避免使用这种形式的代码是面向未来的。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8618811

复制
相关文章

相似问题

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