美元算子($)被认为是坏形式吗?为什么?

时间:2011-12-23 17:14:22

标签: haskell coding-style

在Haskell中,我经常使用$' s来表达表达式。我发现它非常自然和可读,但我有时会读到这是不好的形式,并且不明白为什么它应该是。

1 个答案:

答案 0 :(得分:22)

以下都是好形式:

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

每个barbazquux子表达式都很长。以下是不好的形式:

foo x = bar $ baz $ quux $ x

有两个原因,这是不太可取的。首先,在重构期间,可以将更少的子表达式复制并粘贴到辅助定义中;对于所有($)运算符,只有包含x参数的子表达式才是有效的重构,而(.)($)运算符甚至包括bar . baz或{{1}等子表达式可以拉出一个单独的定义。

首选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

这意味着一些显着不同的东西。因此,通过避免使用此表单来保护您的代码。