Подтвердить что ты не робот

Функции 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 не имеет никаких результатов.

Существуют ли стандартные библиотеки с чем-то подобным? Вероятно, это делает мой код трудным для чтения другими, если у меня такая общая часть является особенной.

4b9b3361

Ответ 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).