在Haskell中,我经常用$'s写表达式,我觉得它很自然,很容易读懂,但我有时会读到它是不好的形式,不明白为什么它应该是这样的。
发布于 2011-12-24 01:25:32
以下都是很好的形式:
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
...which当前不能在没有括号的情况下表示。在使用infixl
应用程序进行解析时,“糟糕的格式”示例如下
foo x = ((bar $ baz) $ quux) $ x
这意味着一些明显不同的东西。因此,避免使用这种形式的代码是面向未来的。
https://stackoverflow.com/questions/8618811
复制相似问题