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

标签 haskell coding-style

在 Haskell 中,我经常用 $ 编写表达式。我觉得它很自然且可读,但有时我读到它的形式很糟糕,不明白为什么会这样。

最佳答案

以下都是很好的形式:

foo = bar . baz . quux
foo x = bar . baz . quux $ x
foo x = (bar . baz . quux) x
foo x = bar (baz (quux x))

我将它们按我的喜好粗略排序,尽管口味总是不同的,而且上下文可能需要不同的选择。我也偶尔看到
foo = bar
    . baz
    . quux

当每个 bar , baz , 和 quux子表达式很长。以下是不好的形式:
foo x = bar $ baz $ quux $ x

这有两个原因不太可取。首先,在重构过程中可以复制和粘贴到辅助定义中的子表达式更少;与所有 ($)运算符,仅包含 x 的子表达式参数是有效的重构,而 (.)($)运算符甚至像 bar . baz 这样的子表达式或 baz . quux可以抽出来单独定义。

偏爱 (.) 的第二个理由预计 ($) 的固定性可能会发生变化;目前,($)infixr ,表示它与右侧相关联,如下所示:
foo x = bar $ (baz $ (quux $ x))

但是,($)如果它是 infixl,将在更多表达式中有用;例如,像
foo h = f (g x) (h y)
foo h = f $ g x $ h y
foo h = (f $ g x) $ h y

...目前无法在没有括号的情况下表示。 “错误形式”示例,当用 infixl 解析时应用程序,将是
foo x = ((bar $ baz) $ quux) $ x

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

关于haskell - 美元运算符 ($) 是否被认为是不好的形式?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8618811/

相关文章:

Pythonic : range vs enumerate in python for loop

c++ - 大型图书馆中命名空间的使用和滥用

haskell - 多线程程序中Haskell数据类型的设计选择

haskell - 编写我自己的最小功能,无法修复错误

haskell - 康威生命游戏递归阶跃函数

在 Haskell 中将多行解析为列表列表

ruby-on-rails - 用于在多行上链接调用的 Ruby 约定

internet-explorer - 如何使用 DOCTYPE XHTML 在 IE8 中删除 3D 边框?

Java游戏数据结构

Haskell 随机数生成