Долларовый оператор ($) считается дурным тоном?Зачем? - PullRequest
17 голосов
/ 23 декабря 2011

В Хаскеле я часто пишу выражения с $.Я нахожу это вполне естественным и читабельным, но иногда я читаю это дурной тон и не понимаю, почему это так.

1 Ответ

22 голосов
/ 23 декабря 2011

Все в хорошем состоянии:

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

что означает что-то существенно другое. Таким образом, будьте уверены в будущем своего кода, избегая этой формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...