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

Существует ли инверсия оператора Haskell $?

Быстрый вопрос: есть ли в Haskell оператор, который работает как знак доллара, но имеет преимущество перед левой стороной. И.Е. вместо

f (x 1) 

записывается как

f $ x 1

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

x 1 $ f

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

Я не знаю, есть ли стандартный оператор, но что мешает вам писать свои собственные? Это работает в 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]

UPDATE: поиск по hoogle для a -> (a -> b) -> b (это тип этого оператора) не нашел ничего полезного.

Ответ 4

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

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

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

Ответ 5

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

someObject # someMessage param1 param2

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

Ответ 6

Не можете ли вы просто переопределить $.

let ($) x f = f x

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