Когда использовать бессмысленный стиль?

Многие программисты haskell, включая меня, как бессмысленный стиль, особенно при написании сложных парсеров. Они делают код более читаемым и менее подробным. Но иногда это просто наоборот (например, при злоупотреблении примерами Monad и друзей для (->) a).

Пожалуйста, дайте мне несколько основных рекомендаций, когда вы думаете, что бессмысленный стиль полезен, а когда нет. Например, я всегда использую лямбда, если мне пришлось использовать частичную композицию (что-то вроде flip ((.) . take) . drop).

Ответы

Ответ 1

Это, очевидно, вопрос личного стиля. Я думаю, что простой стиль - это инструмент для разъяснения ваших идей, а просмотр (->) a как Monad и (->) как Arrow - это хорошо, если он служит этой цели.

Я могу думать об одном, а другой нет:

  • Не сочиняйте с карриной композицией, она слишком сложна для анализа, например, (sort .) . (++) лучше всего написана \xs ys -> sort (xs ++ ys).
  • Используйте любой комбинатор из стандартных модулей Control.*, например, напишите curry (negate *** (+1)), используя (->) как Arrow и ap (zipWith (+)) tail, используя (->) [a] как Monad.

Причина привлечения комбинаторов из общих типов управления заключается не только в том, чтобы сделать ваш смысл понятным, но также напоминать вам, что они существуют и часто полезны не только для определения точек, но и для решения проблем.

Как и все вещи, нужно быть осторожным, чтобы не делать этого. Точное определение, включающее слишком много комбинирующих функций, может быстро усложниться.

Ответ 2

Если у вас есть сомнения, просто создайте функции с помощью (.). Не переходите на смены и свопы и (.) . (.) s