在 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/