Есть ли обратный оператор Haskell $?

Короткий вопрос, есть ли в Haskell оператор, который работает как знак доллара, но отдает приоритет левой стороне. IE вместо

f (x 1) 

пишется как

f $ x 1

Я хотел бы написать это как

x 1 $ f

Это чисто стилистическая вещь. Я запускаю последовательность функций по порядку, и было бы неплохо, если бы я мог написать их слева для записи, чтобы соответствовать тому, что я прочитал слева для записи. Есть ли оператор для этого?

[обновление] Несколько человек спросили, не могу ли я определить свой собственный. В ответ я хотел проверить, что существующего оператора не было до того, как я заново изобрел колесо.

6 ответов

Решение

По состоянию на GHC 7.10 (base 4.8.0.0), & в Data.Function: https://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Function.html

В Haskell вы можете использовать flip изменить порядок аргументов любой двоичной функции или оператора:

ghci> let (|>) = flip ($)
ghci> 3 |> (+4) |> (*6)
42

Не знаю, есть ли стандартный оператор, но что мешает вам написать свой? Это работает в GHCI:

Prelude> let a $> b = b a
Prelude> 1 $> (+2)
3
Prelude> sum [1, 2] $> (+2)
5
Prelude> map (+2) [1, 2] $> map (+3)
[6,7]

ОБНОВЛЕНИЕ: поиск в Google для a -> (a -> b) -> b (это тип этого оператора) ничего полезного не нашел.

Этот комбинатор определен (язык в щеке) в пакете данных-вольере:

Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2)
Loading package data-aviary-0.2.3 ... linking ... done.
3

Хотя на самом деле использовать этот пакет довольно глупо, читать исходники весело, и обнаруживается, что этот комбинатор образован магическим заклинанием flip id (или, на орнитологическом языке, cardinal idiot).

Я не знаю ни одной стандартной версии, но я видел (#), использованный для этой цели в нескольких местах. В частности, на ум приходит HOC, который использует его в такой форме:

someObject # someMessage param1 param2

Кажется, я помню, что видел другие "объектно-ориентированные" библиотеки, использующие оператор # таким же образом, но не могу вспомнить, сколько или каких.

Вы не можете просто переопределить $,

let ($) x f = f x

Или просто выберите другого оператора, как $$

Другие вопросы по тегам