在Haskell中,我经常使用$' s来表达表达式。我发现它非常自然和可读,但我有时会读到这是不好的形式,并且不明白为什么它应该是。
答案 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
每个bar
,baz
和quux
子表达式都很长。以下是不好的形式:
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
这意味着一些显着不同的东西。因此,通过避免使用此表单来保护您的代码。