Zastanawiam się, dlaczego zawracają sobie głowy definiowaniem i używaniem tego operatora w F #, czy to jest tak, aby mogli uniknąć umieszczania parensów w ten sposób?
Doskonałe pytanie. Określony operator, do którego się odwołujesz (<|
) jest dość bezużytecznym edytorem IME. Pozwala na unikanie nawiasów przy rzadkich okazjach, ale generalnie komplikuje składnię, przeciągając więcej operatorów i sprawia, że trudniej jest dla mniej doświadczonych programistów F # (których jest teraz wielu), aby zrozumieć twój kod. Więc przestałem go używać.
Operator |>
jest o wiele bardziej przydatny, ale tylko dlatego, że pomaga F # poprawnie wnioskować o typach w sytuacjach, w których OCaml nie miałby problemu. Na przykład, oto niektóre OCaml:
List.map (fun o -> o#foo) os
Bezpośrednią odpowiednik nie w F #, ponieważ typ o
nie można wnioskować przed odczytaniem jej foo
własność więc idiomatyczne rozwiązaniem jest przepisać kod tak użyciu |>
tak F # można wywnioskować typ o
przed foo
służy:
os |> List.map (fun o -> o.foo)
rzadko używać innych operatorów (<<
i >>
), ponieważ również skomplikować składnię. Nie lubię też bibliotek kombinatorycznych parserów, które przyciągają wielu operatorów.
Przykład Bytebuster dało to ciekawy:
let f1 str server =
str
|> parseUserName
|> getUserByName server
|> validateLogin <| DateTime.Now
chciałbym napisać to jako:
let f2 str server =
let userName = parseUserName str
let user = getUserByName server userName
validateLogin user DateTime.Now
Brak wsporniki w moim kodu. Moje tymczasowe mają nazwy, więc pojawiają się w debugerze i mogę je sprawdzić, a Intellisense może dać mi zwrot w stylu, gdy najecham na nie myszą.Te cechy są cenne dla kodu produkcyjnego, który będą utrzymywać niefachowcy F #.
Po prostu z ciekawości spędzam dużo czasu tłumacząc z OCaml na F # z powodu dużych zbiorów otwartego kodu w OCaml, łatwość tłumaczenia na F #, możliwość korzystania z Visual Studio i wsparcie tutaj, jakie korzyści zyskujesz przechodząc od F # do OCaml? –
@GuyCoder: Po pierwsze, nie jestem w systemie Windows. Pracuję w systemie Linux. Przypuszczam, że mógłbym użyć Mono do rozwijania F # na Linuksie, ale bardziej jestem zaznajomiony z OCaml i jego łańcuchem narzędzi i myślę, że nie chcę polegać na środowisku wykonawczym Mono. Podobają mi się również niektóre funkcje, które OCaml ma, że F # brakuje jak funktory i moduły pierwszej klasy. Tak, zauważyłem, że jest dużo informacji o przechodzeniu z OCaml do F #, ale nie tak bardzo idąc w drugą stronę. Potrzebujemy jakiejś biblioteki/warstwy kompatybilności. – aneccodeal
Czy wiesz o [FSharp.PowerPack.Compatibility.dll] (https://github.com/fsharp/powerpack/tree/master/src/FSharp.PowerPack.Compatibility)? Nie obejmuje wszystkiego, ale pomaga. Obecnie tłumaczę kod ML z funktorami, będąc po raz pierwszy z funktorami, widzę apel i naprawdę uwielbiam podróż w czasie (http://caml.inria.fr/pub/docs/manual-ocaml- 4.00/manual030.html) funkcja debugowania OCaml. OCaml ma wiele do zaoferowania, a ja polecałbym go równie często jak F #. :) –