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

:: a → (a → b) → b operator (Haskell)

Написав программы Haskell, я обнаружил, что мне нужен такой оператор.

(|>) :: a -> (a -> b) -> b
(|>) = flip ($)
infixl 0 |>

Я думаю, что это полезно при склеивании многих функций вместе.

tText cs = someFun cs   |>
           lines        |>
           map (drop 4) |>
           reverse

Я предпочитаю его над ., потому что при |> порядок, в котором применяются функции, совпадает с порядком, в котором записываются функции.

tText' cs = reverse      . 
            map (drop 4) . 
            lines        . 
            someFun $ cs

Вопрос: это (|>) то, что уже существует в Prelude/некоторой другой базовой библиотеке? Повторное выполнение простых вещей - это нечто глупое, чего я бы хотел избежать.

Поиск в Google не помог. Самое близкое, что я нашел, было >>> (стрелки), но это кажется излишним.

4b9b3361

Ответ 1

Нет, в стандартной библиотеке я ничего не знаю. Годы и годы назад много моего кода импортировало мой breif, но удобный Forwards модуль:

> module Forwards where

> infixl 0 |>
> infixl 9 .>

> (|>) = flip ($)
> (.>) = flip (.)

Я даже использовал то же имя, что и вы!

В наши дни я не использую его вообще - я привык к тому порядку, который использует композиция функции.

Не стесняйтесь использовать свои удобные ярлыки.

Я также использую $ меньше, чем я использовал. Где я писал

thing = this $ that arg $ an other $ it

Теперь я пишу

thing = this . that arg . an other $ it

Ответ 3

Вы также можете определить (| > ) как "flip id", и понимание того, почему это работает, является большим уроком в выводе типа путем унификации, используемого в Haskell.

Ответ 4

Насколько мне известно, я не знаю такой библиотеки. И если такая библиотека существует, я бы посоветовал ее использовать.


Если вы не используете пакет объектива, я бы предложил не использовать внешние операторы такого типа. (В случае этого пакета объектива вам действительно нужен и уже есть такой оператор.)

По моему опыту, ИМХО и тому подобное...

В тех случаях, когда читаемость усиливается с форвардной композицией в отличие от обычного состава (не только при работе с линзами), полезно определить специальный оператор в этом модуле или локально через let или where. Для этого я предпочитаю использовать одиночные символы Юникода, а не комбинации ascii.

(·) = flip (.)
infixl 1 (·)

(§) = ($) -- left associative, no flip
infixl 0 (§)

Несколько лет назад (когда линз не было), я подумал о том, чтобы определить свой собственный модуль для них. Но затем я вырастаю, чтобы использовать этот модуль sooo нечасто, что я, как правило, изобретал колесо. Чтобы эти операторы в библиотеке могли даже увеличить усилие чтения кода: читателю приходится искать тех редко используемых операторов. В этом случае локально определенные операторы лучше.