Все в хорошем состоянии:
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
, могут быть извлечены в отдельном определении. 1019 *
Вторая причина предпочтения (.)
заключается в ожидании возможного изменения в фиксированности ($)
; в настоящее время ($)
равно 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
что означает что-то существенно другое. Таким образом, будьте уверены в будущем своего кода, избегая этой формы.