Ответ 1
Как и в 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 оператор, который работает как знак доллара, но имеет преимущество перед левой стороной. И.Е. вместо
f (x 1)
записывается как
f $ x 1
Я хотел бы написать его как
x 1 $ f
Это чисто стилистическая вещь. Я выполняю последовательность функций по порядку, и было бы неплохо, если бы я мог написать их слева, чтобы написать в соответствии с тем, что я читал слева, чтобы писать. Если для этого есть оператор?
[обновление] Несколько человек спросили, не могу ли я определить свою собственную. В ответ я хотел проверить, не существовал ли оператор, прежде чем я заново изобрел колесо.
Как и в 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]
UPDATE: поиск по hoogle для a -> (a -> b) -> b
(это тип этого оператора) не нашел ничего полезного.
Этот комбинатор определен (язык в щеку) в пакете data-aviary:
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
Или просто выберите другой оператор, например $$