Di F #, penggunaan operator pipa-maju |>
,, cukup umum. Namun, di Haskell saya hanya pernah melihat komposisi fungsi (.)
,, sedang digunakan. Saya memahami bahwa keduanya terkait , tetapi adakah alasan bahasa yang membuat pipa maju tidak digunakan di Haskell atau ada hal lain?
haskell
f#
functional-programming
composition
Ben Lings
sumber
sumber
&
adalah milik Haskell|>
. Terkubur jauh di dalam utas ini dan butuh beberapa hari untuk saya temukan. Saya sering menggunakannya, karena Anda biasanya membaca dari kiri ke kanan untuk mengikuti kode Anda.Jawaban:
Saya menjadi sedikit spekulatif ...
Budaya : Saya pikir
|>
adalah operator penting dalam "budaya" F #, dan mungkin serupa dengan.
Haskell. F # memiliki operator komposisi fungsi<<
tetapi menurut saya komunitas F # cenderung menggunakan gaya bebas poin lebih sedikit daripada komunitas Haskell.Perbedaan bahasa : Saya tidak cukup tahu tentang kedua bahasa untuk dibandingkan, tetapi mungkin aturan untuk menggeneralisasi let-binding cukup berbeda untuk memengaruhi hal ini. Misalnya, saya tahu di F # kadang-kadang menulis
tidak akan dikompilasi, dan Anda memerlukan konversi eta eksplisit:
untuk membuatnya dikompilasi. Ini juga menjauhkan orang dari gaya bebas poin / komposisi, dan menuju gaya pipelining. Juga, inferensi tipe F # terkadang menuntut pipelining, sehingga tipe yang diketahui muncul di sebelah kiri (lihat di sini ).
(Secara pribadi, saya menemukan gaya bebas poin tidak dapat dibaca, tetapi saya kira setiap hal baru / berbeda tampaknya tidak dapat dibaca sampai Anda terbiasa.)
Saya pikir keduanya berpotensi layak dalam kedua bahasa, dan sejarah / budaya / kecelakaan dapat menentukan mengapa setiap komunitas menetap di "penarik" yang berbeda.
sumber
.
dan$
, jadi orang terus menggunakannya.Di F #
(|>)
penting karena pemeriksaan ketik kiri-ke-kanan. Sebagai contoh:umumnya tidak akan memeriksa kesalahan ketik, karena meskipun jenisnya
xs
diketahui, jenis argumenx
ke lambda tidak diketahui pada saat pemeriksa ketik melihatnya, jadi tidak tahu bagaimana menyelesaikannyax.Value
.Sebaliknya
akan berfungsi dengan baik, karena jenis
xs
akan mengarah pada jenisx
yang diketahui.Pemeriksaan ketik kiri-ke-kanan diperlukan karena resolusi nama yang terlibat dalam konstruksi seperti
x.Value
. Simon Peyton Jones telah menulis proposal untuk menambahkan jenis resolusi nama yang serupa ke Haskell, tetapi ia menyarankan menggunakan batasan lokal untuk melacak apakah suatu jenis mendukung operasi tertentu atau tidak. Jadi dalam sampel pertama persyaratan yangx
membutuhkanValue
properti akan diteruskan sampaixs
terlihat dan persyaratan ini dapat diselesaikan. Ini memang memperumit sistem tipe.sumber
Lebih banyak spekulasi, kali ini dari sisi yang didominasi Haskell ...
($)
adalah kebalikan dari(|>)
, dan penggunaannya cukup umum ketika Anda tidak dapat menulis kode tanpa poin. Jadi alasan utama yang(|>)
tidak digunakan di Haskell adalah karena tempatnya sudah diambil alih($)
.Juga, berbicara dari sedikit pengalaman F #, saya pikir
(|>)
sangat populer di kode F # karena menyerupaiSubject.Verb(Object)
struktur OO. Karena F # bertujuan untuk integrasi fungsional / OO yang mulus,Subject |> Verb Object
merupakan transisi yang cukup mulus untuk programmer fungsional baru.Secara pribadi, saya juga suka berpikir dari kiri ke kanan, jadi saya menggunakan
(|>)
di Haskell, tapi menurut saya tidak banyak orang yang melakukannya.sumber
Data.Sequence.|>
, tetapi$>
terlihat masuk akal untuk menghindari konflik di sana. Sejujurnya, hanya ada begitu banyak operator yang tampan, jadi saya hanya akan menggunakan|>
keduanya dan mengelola konflik berdasarkan kasus per kasus. (Juga saya akan tergoda untuk hanya aliasData.Sequence.|>
sebagaisnoc
)($)
dan(|>)
apakah aplikasi bukan komposisi. Keduanya berhubungan (sebagai catatan pertanyaan) tetapi mereka tidak sama (Andafc
adalah(Control.Arrow.>>>)
untuk fungsi).|>
sebenarnya mengingatkan saya pada UNIX|
lebih dari apapun.|>
di F # adalah memiliki properti yang bagus untuk IntelliSense di Visual Studio. Ketik|>
, dan Anda mendapatkan daftar fungsi yang dapat diterapkan ke nilai di sebelah kiri, mirip dengan apa yang terjadi saat mengetik.
setelah objek.Saya pikir kami sedang membingungkan. Haskell's (
.
) setara dengan F #'s (>>
). Jangan bingung dengan F # 's (|>
) yang hanya aplikasi fungsi terbalik dan seperti Haskell's ($
) - terbalik:Saya yakin programmer Haskell memang
$
sering menggunakannya . Mungkin tidak sesering pemrogram F # cenderung menggunakan|>
. Di sisi lain, beberapa orang F # menggunakan>>
gelar yang konyol: http://blogs.msdn.com/b/ashleyf/archive/2011/04/21/programming-is-pointless.aspxsumber
$
operator Haskell - terbalik, Anda juga dapat dengan mudah mendefinisikannya sebagai:a |> b = flip ($)
yang setara dengan pipeline F #, misalnya Anda dapat melakukannya[1..10] |> map f
.
) sama dengan (<<
), sedangkan (>>
) adalah komposisi kebalikannya. Yaitu( >> ) : ('T1 -> 'T2) -> ('T2 -> 'T3) -> 'T1 -> 'T3
vs( << ) : ('T2 -> 'T3) -> ('T1 -> 'T2) -> 'T1 -> 'T3
.
sama dengan>>
. Saya tidak tahu apakah F # memiliki<<
tetapi itu akan menjadi setara (seperti di Elm).Jika Anda ingin menggunakan F #
|>
di Haskell maka di Data.Function adalah&
operatornya (sejakbase 4.8.0.0
).sumber
&
lebih|>
? Saya merasa|>
jauh lebih intuitif, dan itu juga mengingatkan saya pada operator pipa Unix.Komposisi kiri-ke-kanan di Haskell
Beberapa orang menggunakan gaya kiri-ke-kanan (penyampaian pesan) di Haskell juga. Lihat, misalnya, pustaka mps di Hackage. Sebuah contoh:
Saya pikir gaya ini terlihat bagus dalam beberapa situasi, tetapi lebih sulit untuk dibaca (seseorang perlu mengetahui perpustakaan dan semua operatornya, definisi ulang
(.)
juga mengganggu).Ada juga operator komposisi kiri-ke-kanan serta kanan-ke-kiri di Control.Category , bagian dari paket dasar. Bandingkan
>>>
dan<<<
masing - masing:Terkadang ada alasan bagus untuk memilih komposisi kiri-ke-kanan: urutan evaluasi mengikuti urutan pembacaan.
sumber
Saya telah melihat
>>>
digunakan untukflip (.)
, dan saya sering menggunakannya sendiri, terutama untuk rantai panjang yang paling baik dipahami dari kiri-ke-kanan.>>>
sebenarnya dari Control.Arrow, dan bekerja pada lebih dari sekadar fungsi.sumber
>>>
didefinisikan dalamControl.Category
.Selain gaya dan budaya, ini bermuara pada pengoptimalan desain bahasa untuk kode murni atau tidak murni.
The
|>
operator adalah umum di F # sebagian besar karena membantu menyembunyikan dua keterbatasan yang muncul dengan kode dominan-tidak murni:Perhatikan bahwa batasan sebelumnya tidak ada di OCaml karena subtipe bersifat struktural, bukan nominal, sehingga tipe struktural mudah disempurnakan melalui penyatuan saat inferensi tipe berlangsung.
Haskell mengambil trade-off yang berbeda, memilih untuk fokus pada kode yang didominasi murni di mana batasan ini dapat dicabut.
sumber
Saya pikir operator pipa forward F # (
|>
) harus vs ( & ) di haskell.Jika Anda tidak menyukai
&
operator ( ), Anda dapat menyesuaikannya seperti F # atau Elixir:Kenapa
infixl 1 |>
? Lihat dokumen di Data-Function (&)(.)
(
.
) berarti komposisi fungsi. Artinya (fg) (x) = f (g (x)) dalam Matematika.itu sama
atau
Operator (
$
) juga didefinisikan dalam Data-Function ($) .(
.
) digunakan untuk membuatHight Order Function
atauclosure in js
. Lihat contoh:Wow, Lebih sedikit (kode) lebih baik.
Bandingkan
|>
dan.
Ini adalah perbedaan antara
left —> right
danright —> left
. ⊙﹏⊙ ||i>Humanisasi
|>
dan&
lebih baik dari.
karena
Bagaimana pemrograman fungsional dalam bahasa berorientasi objek?
silakan kunjungi http://reactivex.io/
Ini mendukung:
sumber
Ini adalah hari pertama saya mencoba Haskell (setelah Rust dan F #), dan saya bisa mendefinisikan operator F #'s |>:
dan sepertinya berhasil:
Saya yakin pakar Haskell dapat memberi Anda solusi yang lebih baik.
sumber
x |> f = f x