Saya sedang belajar Aplikasi Haskell. Sepertinya saya (saya mungkin salah) bahwa pure
fungsi ini tidak benar-benar diperlukan, misalnya:
pure (+) <*> [1,2,3] <*> [3,4,5]
dapat ditulis sebagai
(+) <$> [1,2,3] <*> [3,4,5]
Adakah yang bisa menjelaskan manfaat yang diberikan pure
fungsi tersebut daripada pemetaan eksplisit fmap
?
haskell
applicative
Gil Shafriri
sumber
sumber
pure f <*> x
persis sama denganfmap f x
. Saya yakin ada beberapa alasan mengapapure
disertakanApplicative
, tetapi saya tidak sepenuhnya yakin mengapa.pure
memungkinkan seseorang untuk menggunakan, baik, nilai "murni" dalam perhitungan Applicative. Sementara, seperti yang Anda amati dengan benar,pure f <*> x
sama denganf <$> x
, tidak ada yang setara untuk, katakanlahf <*> x <*> pure y <*> z
,. (Setidaknya saya tidak berpikir begitu.)Monoid
kelas penting - di manapure
sesuai denganMonoid
elemen identitas. (Ini menunjukkan bahwaApplicative
tanpapure
bisa menarik, karenaSemigroup
- yang merupakanMonoid
tanpa harus memiliki identitas - masih digunakan. Sebenarnya, sekarang saya berpikir tentang hal itu, saya ingat PureScript memilikipure
kelas "Applicative without " yang persis seperti itu , walaupun saya tidak tau untuk apa itu digunakan.)fmap (\f' x' z' -> f' x' y z') f <*> x <*> z
, saya pikir. Idenya dalamApplicative
dokumentasi sebagai hukum "pertukaran".Applicative
tanpapure
adaApply
dari semigroupoids .Jawaban:
Saya berada di ujung kompetensi saya di sini, jadi jangan anggap ini terlalu banyak, tetapi terlalu lama untuk berkomentar.
Mungkin ada alasan praktis untuk dimasukkan ke
pure
dalam kelas tipe, tetapi banyak abstraksi Haskell berasal dari dasar-dasar teoretis, dan saya percaya itulah yang terjadiApplicative
juga. Seperti yang dikatakan dalam dokumentasi, ini adalah fungsi monoid lemah yang kuat (lihat https://cstheory.stackexchange.com/q/12412/56098 untuk elaborasi). Saya kira itupure
berfungsi sebagai identitas , sepertireturn
halnya untukMonad
(yang merupakan monoid dalam kategori endofunctors ).Pertimbangkan
pure
danliftA2
:Jika Anda sedikit menyipit, Anda mungkin bisa membayangkan bahwa itu
liftA2
adalah operasi biner, yang juga merupakan apa yang dinyatakan oleh dokumentasi:pure
Maka, adalah identitas yang sesuai.sumber
Applicative
tanpapure
akan menjadi, hm, functor semigroupal daripada yang monoid.fmap
tidak selalu memotongnya. Secara khusus,pure
adalah apa yang memungkinkan Anda memperkenalkanf
(di manaf
adalahApplicative
) ketika Anda belum memilikinya. Contoh yang bagus adalahDibutuhkan daftar "tindakan" yang menghasilkan nilai dan mengubahnya menjadi tindakan yang menghasilkan daftar nilai. Apa yang terjadi ketika tidak ada tindakan dalam daftar? Satu-satunya hasil yang waras adalah tindakan yang tidak menghasilkan nilai:
Jika tidak
pure
, Anda harus meminta daftar tindakan kosong. Anda pasti bisa membuatnya bekerja, tetapi itu seperti berbicara tentang penambahan tanpa menyebutkan 0 atau perkalian tanpa 1 (seperti yang orang lain katakan, karenaApplicative
s bersifat monoid). Anda akan berulang kali mengalami kasus tepi yang mudah dipecahkan,pure
tetapi harus diselesaikan dengan pembatasan aneh pada input Anda dan bantuan band lainnya.sumber