Функции Haskell слева направо
У меня есть функция, которую я использую довольно часто, что позволяет мне писать код таким образом, который кажется мне более естественным.
infixl 6 $:
($:) :: a -> (a -> b) -> b
a $: f = f a
Это позволяет мне делать что-то вроде
let x = getData
$: sort
$: group
$: aggregate
вместо
let x = aggregate
$ group
$ sort
$ getData
Недавно я узнал, что Clojure имеет что-то вроде этого встроенного (я не знаю много Clojure, но я думаю, что это будет написано (-> getData sort group aggregate)
?), что заставляет меня задаться вопросом, построил ли он Haskell Что ж. Hoogle не имеет никаких результатов.
Существуют ли стандартные библиотеки с чем-то подобным? Вероятно, это делает мой код трудным для чтения другими, если у меня такая общая часть является особенной.
Ответы
Ответ 1
Нет ничего подобного, но Control.Category.(>>>)
близок: it flip (.)
, поэтому вы можете написать
f x = x $: sort $: group $: aggregate
а
f = sort >>> group >>> aggregate
Там нет недостатка определений и имен для комбинатора ($:)
. Я думаю, что функции, как правило, подходят к стилю трубопровода чаще, чем простые приложения, поэтому я не чувствую большой необходимости в этом; (>>>)
является немного уродливым.
(Кроме того, нестрогая семантика Haskell означает, что поток данных не обязательно находится в том направлении, в котором указываются стрелки, ведь aggregate
может предоставить первый конструктор до того, как sort
даже получит шанс посмотрите на аргумент. Поэтому я обычно использую (.)
и ($)
; я привык к порядку.)
Ответ 2
Обратный оператор приложения, который вы описываете, теперь является частью стандартного пакета base
(начиная с 4.8.0) в качестве &
operator.
Обратите внимание, что этот оператор связывается слабее, чем тот, который вы предложили (infixl 1
).