В F # |>
довольно часто используется оператор конвейерной передачи ,. Однако в Haskell я видел только использование композиции функций (.)
. Я понимаю, что они связаны , но есть ли языковая причина, по которой конвейерная передача не используется в Haskell, или это что-то еще?
haskell
f#
functional-programming
composition
Бен Лингс
источник
источник
&
это Haskell's|>
. Похоронен глубоко в этой теме, и мне потребовалось несколько дней, чтобы это обнаружить. Я часто его использую, потому что вы, естественно, читаете слева направо, чтобы следовать своему коду.Ответы:
Я немного рассуждаю ...
Культура : я считаю, что
|>
это важный оператор в «культуре» F # и, возможно, аналогично.
для Haskell. В F # есть оператор композиции функций,<<
но я думаю, что сообщество F # склонно меньше использовать стиль без точек, чем сообщество Haskell.Языковые различия : я недостаточно знаю оба языка для сравнения, но, возможно, правила обобщения let-привязок достаточно разные, чтобы повлиять на это. Например, я знаю, что в F # иногда пишу
не будет компилироваться, и вам потребуется явное eta-преобразование:
чтобы он компилировался. Это также уводит людей от бессмысленного / композиционного стиля в сторону конвейерного стиля. Кроме того, для вывода типа F # иногда требуется конвейерная обработка, так что известный тип отображается слева (см. Здесь ).
(Лично я считаю стиль без точек нечитаемым, но я полагаю, что каждая новая / другая вещь кажется нечитаемой, пока вы к ней не привыкнете.)
Я думаю, что оба они потенциально жизнеспособны на любом языке, и история / культура / случайность могут определить, почему каждое сообщество обосновалось на другом «аттракторе».
источник
.
и$
, поэтому люди продолжают их использовать.В F #
(|>)
это важно из-за проверки типов слева направо. Например:обычно не выполняется проверка типов, потому что даже если тип
xs
известен, тип аргументаx
лямбда неизвестен в то время, когда средство проверки типов его видит, поэтому он не знает, как разрешитьx.Value
.Напротив
будет работать нормально, потому что тип
xs
ведет к известному типуx
.Проверка типов слева направо требуется из-за разрешения имен, задействованного в таких конструкциях, как
x.Value
. Саймон Пейтон Джонс написал предложение о добавлении подобного типа разрешения имен в Haskell, но вместо этого он предлагает использовать локальные ограничения, чтобы отслеживать, поддерживает ли тип конкретную операцию или нет. Таким образом, в первом примере требование, которомуx
требуетсяValue
свойство, будет перенесено до тех пор, пока неxs
будет обнаружено и это требование не будет разрешено. Однако это усложняет систему типов.источник
Больше предположений, на этот раз со стороны преимущественно Haskell ...
($)
- это переворот(|>)
, и его использование довольно распространено, когда вы не можете писать бессмысленный код. Итак, основная причина, по которой(|>)
не используется Haskell, заключается в том, что его место уже занято($)
.Кроме того, исходя из небольшого опыта F #, я считаю, что
(|>)
код F # настолько популярен, потому что он напоминаетSubject.Verb(Object)
структуру OO. Поскольку F # нацелен на плавную функциональную / объектно-ориентированную интеграцию,Subject |> Verb Object
это довольно плавный переход для новых функциональных программистов.Лично мне тоже нравится думать слева направо, поэтому я использую
(|>)
в Haskell, но не думаю, что многие другие люди это делают.источник
Data.Sequence.|>
, но$>
выглядит разумным, чтобы избежать там конфликтов. Честно говоря, симпатичных операторов не так уж много, поэтому я бы просто использовал|>
оба и управлял конфликтами в каждом конкретном случае. (Кроме того, я был бы соблазн просто псевдоним ,Data.Sequence.|>
какsnoc
)($)
и(|>)
являются приложением, а не составом. Два связаны (как вопрос примечания) , но они не совпадают (вашеfc
есть(Control.Arrow.>>>)
для функций).|>
напоминает мне UNIX|
.|>
F # состоит в том, что он имеет хорошие свойства для IntelliSense в Visual Studio. Введите|>
, и вы получите список функций, которые можно применить к значению слева, аналогично тому, что происходит при вводе текста.
после объекта.Я думаю, мы что-то путаем. Haskell (
.
) эквивалентен F # (>>
). Не путать с F # (|>
), которое представляет собой просто инвертированное приложение функции и похоже на Haskell ($
) - наоборот:Я считаю, что программисты на Haskell
$
часто его используют . Возможно, не так часто, как привыкли использовать программисты на F #|>
. С другой стороны, некоторые ребята из F #>>
до смешного используют: http://blogs.msdn.com/b/ashleyf/archive/2011/04/21/programming-is-pointless.aspxисточник
$
оператор Haskell - в обратном порядке, вы также можете легко определить его как:a |> b = flip ($)
который становится эквивалентным конвейеру F #, например, вы можете сделать[1..10] |> map f
.
) то же самое, что (<<
), тогда как (>>
) - обратная композиция. То есть( >> ) : ('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3
против( << ) : ('T2 -> 'T3) -> ('T1 -> 'T2) -> 'T1 -> 'T3
.
это эквивалентно>>
. Я не знаю, есть ли у F #,<<
но это будет эквивалент (как в Elm).Если вы хотите использовать F #
|>
в Haskell, тогда в Data.Function будет&
оператор (сbase 4.8.0.0
).источник
&
более|>
? Я чувствую, что|>
это намного более интуитивно понятно, и это также напоминает мне оператор трубы Unix.&
очень интуитивным. Код почти правильно читается на английском, просто произносится&
как «и». Например:5 & factorial & show
читается вслух как «возьмите 5, затем возьмите факториал и примените к нему шоу».Композиция слева направо в Haskell
Некоторые люди также используют стиль слева направо (передача сообщений) в Haskell. См., Например, библиотеку mps на сайте Hackage. Пример:
Я думаю, что в некоторых ситуациях этот стиль выглядит хорошо, но его сложнее читать (нужно знать библиотеку и все ее операторы, переопределение
(.)
тоже мешает).В Control.Category , являющейся частью базового пакета, также есть операторы компоновки слева направо и справа налево . Сравните
>>>
и<<<
соответственно:Иногда есть веская причина предпочесть композицию слева направо: порядок оценки следует порядку чтения.
источник
Я видел, как
>>>
их использовалиflip (.)
, и сам часто использую это, особенно для длинных цепочек, которые лучше всего понимать слева направо.>>>
на самом деле из Control.Arrow и работает не только с функциями.источник
>>>
определяется вControl.Category
.Помимо стиля и культуры, это сводится к оптимизации дизайна языка для чистого или нечистого кода.
|>
Оператор часто встречается в F # в основном потому , что это помогает скрыть два ограничения , которые появляются с преимущественно-нечистым кодом:Обратите внимание, что первое ограничение не существует в OCaml, потому что подтип является структурным, а не номинальным, поэтому структурный тип легко уточняется с помощью унификации по мере продвижения вывода типа.
Haskell идет на другой компромисс, предпочитая сосредоточиться на преимущественно чистом коде, где эти ограничения могут быть сняты.
источник
Я думаю, что оператор F # pipe forward (
|>
) должен vs ( & ) в haskell.Если вам не нравится
&
оператор ( ), вы можете настроить его как F # или Elixir:Почему
infixl 1 |>
? См. Документ в Data-Function (&)(.)
(
.
) означает композицию функций. Это означает (fg) (x) = f (g (x)) в Math.это равно
или
(
$
) также определяется в Data-Function ($) .(
.
) используется для созданияHight Order Function
илиclosure in js
. См. Пример:Вау, меньше (код) лучше.
Сравните
|>
и.
Это разница между
left —> right
иright —> left
. ⊙﹏⊙ |||Гуманизация
|>
и&
лучше чем.
так как
Как функциональное программирование на объектно-ориентированном языке?
посетите http://reactivex.io/
ИТ поддержка :
источник
Это мой первый день, когда я пробую Haskell (после Rust и F #), и я смог определить оператор F # |>:
и вроде работает:
Бьюсь об заклад, эксперт по Haskell может предложить вам еще лучшее решение.
источник
x |> f = f x