Есть ли обратный оператор 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
Или просто выберите другого оператора, как $$