W języku F # użycie operatora potoku do przodu |>
jest dość powszechne. Jednak w Haskell widziałem tylko kompozycję funkcji (.)
, która jest używana. Rozumiem, że są one powiązane , ale czy jest jakiś powód językowy, dla którego funkcja potoku do przodu nie jest używana w Haskell, czy jest to coś innego?
haskell
f#
functional-programming
composition
Ben Lings
źródło
źródło
&
należy do Haskella|>
. Zagrzebany głęboko w tym wątku i odkrycie zajęło mi kilka dni. Używam go często, ponieważ naturalnie czytasz od lewej do prawej, aby postępować zgodnie z kodem.Odpowiedzi:
Jestem trochę spekulatywny ...
Kultura : Myślę, że
|>
jest ważnym operatorem w „kulturze” języka F # i być może podobnie w.
przypadku Haskella. F # ma operator kompozycji funkcji,<<
ale myślę, że społeczność F # ma tendencję do mniejszego używania stylu bez punktów niż społeczność Haskell.Różnice językowe : nie wiem wystarczająco dużo na temat obu języków, aby je porównać, ale być może reguły uogólniających powiązań let są na tyle różne, że mają na to wpływ. Na przykład wiem, że w F # czasami piszę
nie skompiluje się i potrzebujesz jawnej konwersji eta:
aby to skompilować. To także odwraca ludzi od stylu bez punktów / kompozycji i kieruje się w stronę stylu pipelining. Ponadto wnioskowanie o typie F # czasami wymaga potokowania, tak że znany typ pojawia się po lewej stronie (patrz tutaj ).
(Osobiście uważam, że styl bez punktów jest nieczytelny, ale przypuszczam, że każda nowa / inna rzecz wydaje się nieczytelna, dopóki się do tego nie przyzwyczaisz.)
Myślę, że oba są potencjalnie możliwe w każdym języku, a historia / kultura / przypadek mogą definiować, dlaczego każda społeczność osiedliła się w innym „atraktorze”.
źródło
.
i$
, więc ludzie nadal ich używają.W języku F #
(|>)
jest ważne ze względu na sprawdzanie pisma od lewej do prawej. Na przykład:generalnie nie sprawdza typu, ponieważ nawet jeśli typ
xs
jest znany, typ argumentux
do lambda nie jest znany w momencie, gdy sprawdzacz typu go widzi, więc nie wie, jak rozwiązaćx.Value
.W przeciwieństwie
będzie działać dobrze, ponieważ rodzaj
xs
będzie prowadził do typux
bycia znanym.Sprawdzanie typu od lewej do prawej jest wymagane z powodu rozpoznawania nazw zaangażowanych w konstrukcje, takie jak
x.Value
. Simon Peyton Jones napisał propozycję dodania podobnego rodzaju rozpoznawania nazw do Haskella, ale sugeruje użycie lokalnych ograniczeń do śledzenia, czy typ obsługuje określoną operację, czy nie. Tak więc w pierwszej próbce wymaganiex
wymagająceValue
właściwości zostanie przeniesione do momentu, gdyxs
zostanie zauważone i można go rozwiązać. To jednak komplikuje system czcionek.źródło
Więcej spekulacji, tym razem ze strony z przewagą Haskella ...
($)
jest odwrotnością(|>)
, a jej użycie jest dość powszechne, gdy nie można pisać kodu bez punktów. Więc głównym powodem, który(|>)
nie jest używany w Haskell, jest to, że jego miejsce jest już zajęte($)
.Ponadto, mówiąc z doświadczenia F #, myślę, że
(|>)
jest tak popularny w kodzie F #, ponieważ przypominaSubject.Verb(Object)
strukturę OO. Ponieważ F # ma na celu płynną integrację funkcjonalną / OO,Subject |> Verb Object
jest to całkiem płynne przejście dla nowych programistów funkcjonalnych.Osobiście lubię też myśleć od lewej do prawej, więc używam
(|>)
w Haskell, ale nie sądzę, żeby wielu innych ludzi to robiło.źródło
Data.Sequence.|>
, ale$>
wydaje się rozsądne, aby uniknąć tam konfliktów. Szczerze mówiąc, jest tylko tak wielu dobrze wyglądających operatorów, więc użyłbym po prostu|>
do obu i zarządzałem konfliktami na podstawie każdego przypadku. (Również kusiłbym, aby po prostu pseudonimowaćData.Sequence.|>
jakosnoc
)($)
i(|>)
są aplikacją, a nie kompozycją. Oba są powiązane (jak notatki do pytań), ale nie są takie same (twojefc
dotyczy(Control.Arrow.>>>)
funkcji).|>
przypomina mi UNIX|
bardziej niż cokolwiek innego.|>
F # jest to, że ma ładne właściwości dla IntelliSense w programie Visual Studio. Wpisz|>
, a otrzymasz listę funkcji, które można zastosować do wartości po lewej stronie, podobnie jak w przypadku wpisywania.
po obiekcie.Myślę, że mylimy rzeczy. Haskell (
.
) jest odpowiednikiem F # (>>
). Nie mylić z F # (|>
), która jest po prostu odwróconą aplikacją funkcji i jest jak Haskell ($
) - odwrócona:Uważam, że programiści Haskell
$
często używają . Być może nie tak często, jak zwykle używają programiści F #|>
. Z drugiej strony, niektórzy faceci z F # używają>>
w śmiesznym stopniu: http://blogs.msdn.com/b/ashleyf/archive/2011/04/21/programming-is-pointless.aspxźródło
$
operator Haskella - odwrócony, możesz go również łatwo zdefiniować jako:a |> b = flip ($)
który staje się odpowiednikiem potoku F #, np. możesz to zrobić[1..10] |> map f
.
) to samo co (<<
), podczas gdy (>>
) to kompozycja odwrotna. To znaczy( >> ) : ('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3
vs( << ) : ('T2 -> 'T3) -> ('T1 -> 'T2) -> 'T1 -> 'T3
.
jest to równoważne>>
. Nie wiem, czy F # ma,<<
ale byłby to odpowiednik (jak w Elm).Jeśli chcesz używać F #
|>
w Haskell, to w Data.Function jest&
operator (odbase 4.8.0.0
).źródło
&
ponad|>
? Wydaje mi się, że|>
jest znacznie bardziej intuicyjny, a także przypomina mi operatora potoku Unix.&
bardzo intuicyjne. Kod prawie czyta się poprawnie w języku angielskim, po prostu wymawiając&
jako „i”. Na przykład:5 & factorial & show
czyta się na głos jako „weź 5, a następnie weź silnię z tego, a następnie zastosuj pokaz”.Kompozycja od lewej do prawej w Haskell
Niektórzy ludzie używają w Haskellu stylu od lewej do prawej (przekazywanie wiadomości). Zobacz na przykład bibliotekę mps w witrynie Hackage. Przykład:
Myślę, że ten styl wygląda ładnie w niektórych sytuacjach, ale jest trudniejszy do odczytania (trzeba znać bibliotekę i wszystkie jej operatory, redefinicja
(.)
też przeszkadza).Istnieją również operatory kompozycji od lewej do prawej oraz od prawej do lewej w Control.Category , części pakietu podstawowego. Porównaj
>>>
i<<<
odpowiednio:Jest dobry powód, aby czasami preferować kompozycję od lewej do prawej: kolejność oceny jest zgodna z porządkiem czytania.
źródło
Widziałem, jak
>>>
byłem używanyflip (.)
i często tego używam, szczególnie w przypadku długich łańcuchów, które najlepiej rozumieć od lewej do prawej.>>>
pochodzi z Control.Arrow i działa nie tylko na funkcjach.źródło
>>>
jest zdefiniowany wControl.Category
.Oprócz stylu i kultury sprowadza się to do optymalizacji projektu języka pod kątem czystego lub nieczystego kodu.
|>
Operator jest powszechne w F # w dużej mierze dlatego, że pomaga ukryć dwa ograniczenia, które pojawiają się głównie z kodem-zanieczyszczonego:Należy zauważyć, że poprzednie ograniczenie nie istnieje w OCaml, ponieważ podtypy są strukturalne, a nie nominalne, więc typ strukturalny można łatwo doprecyzować poprzez ujednolicenie w miarę postępu wnioskowania o typie.
Haskell wybiera inny kompromis, wybierając skupienie się na czystym kodzie, w którym te ograniczenia można znieść.
źródło
Myślę, że operator potoku F # do przodu (
|>
) powinien vs ( & ) w haskell.Jeśli nie lubisz
&
operatora ( ), możesz go dostosować, na przykład F # lub Elixir:Dlaczego
infixl 1 |>
? Zobacz dokument w Data-Function (&)(.)
(
.
) oznacza kompozycję funkcji. Oznacza to (fg) (x) = f (g (x)) w Math.to jest równe
lub
(
$
) operator jest również zdefiniowany w Data-Function ($) .(
.
) służy do tworzeniaHight Order Function
lubclosure in js
. Zobacz przykład:Wow, mniej (kod) jest lepsze.
Porównaj
|>
i.
To jest różnica między
left —> right
iright —> left
. ⊙﹏⊙ |||Uczłowieczenie
|>
i&
jest lepszy niż.
ponieważ
Jak programować funkcjonalnie w języku obiektowym?
odwiedź http://reactivex.io/
Obsługuje:
źródło
To mój pierwszy dzień, aby wypróbować Haskell (po Rust i F #) i udało mi się zdefiniować operator F # |>:
i wydaje się, że działa:
Założę się, że ekspert Haskell może dać ci jeszcze lepsze rozwiązanie.
źródło
x |> f = f x