Есть ли обратный оператор Haskell $? - PullRequest
36 голосов
/ 03 ноября 2010

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

f (x 1) 

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

f $ x 1

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

x 1 $ f

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

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

Ответы [ 6 ]

29 голосов
/ 11 июля 2015

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

29 голосов
/ 04 ноября 2010

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

ghci> let (|>) = flip ($)
ghci> 3 |> (+4) |> (*6)
42
20 голосов
/ 03 ноября 2010

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

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

10 голосов
/ 04 ноября 2010

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

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

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

4 голосов
/ 03 ноября 2010

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

someObject # someMessage param1 param2

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

0 голосов
/ 03 ноября 2010

Разве вы не можете просто переопределить $.

let ($) x f = f x

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

...