Sebagian besar sejarah. fmap berbeda dari peta karena alasan pedagogis, liftM berbeda dari fmap karena alasan historis (yaitu Functor bukan superclass dari Monad)
luqui
12
Oh, dan hanya untuk memperjelas: Mereka "pada dasarnya" tidak melakukan hal yang sama. Keduanya mapdan liftMpasti harus melakukan hal yang persis sama seperti fmap.
CA McCann
2
Sementara fmapdan liftMmelakukan hal yang persis sama, maptentu saja hanya kasus khusus dari mereka, yaitu sesuatu yang berbeda. fmap id getLinediketik dengan baik, sedangkan map id getLinetidak.
Anda mungkin bertanya mengapa kami membutuhkan fungsi peta terpisah. Mengapa tidak menyingkirkan saja fungsi peta hanya-daftar saat ini, dan mengganti nama fmap menjadi peta? Nah, itu pertanyaan yang bagus. Argumen yang biasa adalah bahwa seseorang yang baru saja mempelajari Haskell, ketika menggunakan peta secara tidak benar, lebih suka melihat kesalahan tentang daftar daripada tentang Functor.
fmapdan liftMada karena monad tidak secara otomatis berfungsi di Haskell:
Fakta bahwa kita memiliki fmap dan liftM adalah konsekuensi yang tidak menguntungkan dari fakta bahwa kelas tipe Monad tidak memerlukan turunan Functor, meskipun secara matematis, setiap monad adalah functor. Namun, fmap dan liftM pada dasarnya dapat dipertukarkan, karena ini adalah bug (dalam arti sosial daripada teknis) untuk semua jenis yang menjadi instance Monad tanpa juga menjadi instance Functor.
Sebenarnya bukan itu yang terjadi. Yang terjadi adalah tipe peta digeneralisasikan untuk mencakup Functor di Haskell 1.3. Yaitu, di Haskell 1.3 fmap disebut map. Perubahan ini kemudian dikembalikan di Haskell 1.4 dan fmap diperkenalkan. Alasan perubahan ini adalah karena pedagogis; saat mengajari Haskell kepada pemula, tipe peta yang sangat umum membuat pesan kesalahan lebih sulit untuk dipahami. Menurut saya, ini bukan cara yang tepat untuk menyelesaikan masalah.
Dan, dari sudut pandang saya sebagai seseorang yang pertama kali bertemu Haskell lebih dari satu dekade setelah perubahan yang dijelaskan @augustss dibuat, dan telah menghabiskan banyak waktu untuk membantu orang-orang yang sedang belajar bahasa sekarang, sama sekali tidak jelas bahwa itu bahkan membantu dalam dengan cara apapun. Tentu saja tidak cukup untuk mengimbangi redundansi yang tidak berguna (yang dengan sendirinya menyebabkan orang mengajukan pertanyaan seperti ini); yang Functorkelas terlalu umum untuk mengabaikan, dan pemula sering bingung dengan pesan error pula!
CA McCann
10
Tidak bisakah kita menghapusnya liftM? Biarkan kode rusak, siapa peduli, biasanya butuh waktu kurang dari 2 hari untuk kode diperbaiki di github dan kemudian diunggah di hackage. Atau apakah saya menjadi liar dan gila?
Tarrasch
1
@Tarrasch: tidak semua orang menggunakan github, tidak semua paket memiliki rekam jejak yang bagus untuk diperbarui tepat waktu, dan saya untuk satu cenderung menggunakan liftMsaat berada dalam blok-do daripada fmapkarena itu lebih cocok dengan saat saya menggunakan liftM2, dll. demikian juga.
@ L01man Ya, ini akan segera diperbaiki. The Aplikatif Monad Proposal (AMP) terlihat seperti itu akan masuk ke versi berikutnya dari Haskell. GHC 7.8.3 memiliki bendera baru --fwarn-ampuntuk membantu memperbarui kode yang ada untuk transisi.
map
danliftM
pasti harus melakukan hal yang persis sama sepertifmap
.fmap
danliftM
melakukan hal yang persis sama,map
tentu saja hanya kasus khusus dari mereka, yaitu sesuatu yang berbeda.fmap id getLine
diketik dengan baik, sedangkanmap id getLine
tidak.Jawaban:
map
ada untuk menyederhanakan operasi pada daftar dan untuk alasan historis (lihat Apa gunanya peta di Haskell, bila ada fmap? ).- Typeclassopedia , halaman 20
fmap
danliftM
ada karena monad tidak secara otomatis berfungsi di Haskell:- Typeclassopedia , halaman 33
Sunting: sejarah agustuss
map
danfmap
:- Apa gunanya map di Haskell, kalau ada fmap?
sumber
Functor
kelas terlalu umum untuk mengabaikan, dan pemula sering bingung dengan pesan error pula!liftM
? Biarkan kode rusak, siapa peduli, biasanya butuh waktu kurang dari 2 hari untuk kode diperbaiki di github dan kemudian diunggah di hackage. Atau apakah saya menjadi liar dan gila?liftM
saat berada dalam blok-do daripadafmap
karena itu lebih cocok dengan saat saya menggunakanliftM2
, dll. demikian juga.--fwarn-amp
untuk membantu memperbarui kode yang ada untuk transisi.