Di mana pun saya mencoba menggunakan map
, fmap
telah berhasil juga. Mengapa pencipta Haskell merasa membutuhkan suatu map
fungsi? Tidak bisakah itu hanya apa yang saat ini dikenal sebagai fmap
dan fmap
dapat dihapus dari bahasa?
98
fmap
. Ini untuk memetakan fungsi melalui instance Functor. Saya ingin tahu tentang tujuan dari spesialisasi tersebutmap
.Jawaban:
Saya ingin membuat jawaban untuk menarik perhatian pada komentar Agustus :
Haskell 98 dipandang sebagai langkah mundur oleh beberapa Haskeller (termasuk saya), versi sebelumnya telah mendefinisikan pustaka yang lebih abstrak dan konsisten. Baiklah.
sumber
map and fmap
telah sekitar untuk waktu yang lama - itu dipanaskan ulang di milis Haskell-prime pada bulan Agustus 2006 - haskell.org/pipermail/haskell-prime/2006-August/thread.html . Sebagai pengimbang, saya lebih suka status quo. Bagi saya, tampaknya berharga bahwa ada bagian dari Haskell yang secara kasar mirip dengan Miranda. Di Inggris, Miranda digunakan sebagai bahasa pengajaran untuk siswa matematika, bukan hanya siswa ilmu komputer. Jika ceruk itu belum hilang dari bahasa non-fungsional (misalnya Mathematica), saya tidak melihat Haskell dengan kesatuan yangmap
mengisinya.Mengutip dari
Functor
dokumentasi di https://wiki.haskell.org/Typeclassopedia#Functorsumber
Mereka terlihat sama di situs aplikasi tetapi mereka berbeda, tentunya. Saat Anda menerapkan salah satu dari dua fungsi tersebut,
map
ataufmap
, ke daftar nilai, keduanya akan menghasilkan hasil yang sama tetapi itu tidak berarti fungsi tersebut dimaksudkan untuk tujuan yang sama.Jalankan sesi GHCI (Glasgow Haskell Compiler Interactive) untuk meminta informasi tentang kedua fungsi tersebut, kemudian lihat implementasinya dan Anda akan menemukan banyak perbedaan.
peta
Tanya GHCI untuk informasi tentang
map
dan Anda akan melihatnya ditetapkan sebagai fungsi tingkat tinggi yang berlaku untuk daftar nilai jenis apa pun
a
menghasilkan daftar nilai jenis apa punb
. Meskipun polimorfik (a
danb
dalam definisi di atas berarti semua tipe)map
fungsi ini dimaksudkan untuk diterapkan ke daftar nilai yang hanya merupakan satu tipe data yang mungkin di antara banyak tipe data lainnya di Haskell. Themap
Fungsi tidak dapat diterapkan untuk sesuatu yang bukan merupakan daftar nilai.Seperti yang dapat Anda baca dari kode sumber GHC.Base ,
map
fungsi tersebut diimplementasikan sebagai berikutyang memanfaatkan pencocokan pola untuk menarik kepala (the
x
) dari ekor (thexs
) dari daftar, kemudian membuat daftar baru dengan menggunakan:
konstruktor nilai (kontra) sehingga untuk menambahkanf x
(baca sebagai "f diterapkan ke x" ) ke rekursimap
melewati ekor sampai daftar kosong. Perlu diperhatikan bahwa implementasimap
fungsi tidak bergantung pada fungsi lain tetapi hanya pada dirinya sendiri.fmap
Sekarang coba untuk menanyakan informasi tentang
fmap
dan Anda akan melihat sesuatu yang sangat berbeda.Kali
fmap
ini didefinisikan sebagai salah satu fungsi yang implementasinya harus disediakan oleh tipe data yang ingin dimilikiFunctor
kelas tipe. Artinya, bisa ada lebih dari satu tipe data, tidak hanya "daftar nilai" , yang dapat menyediakan implementasi untukfmap
fungsi tersebut. Itu membuatfmap
dapat diterapkan ke kumpulan tipe data yang jauh lebih besar: fungtor memang!Seperti yang dapat Anda baca dari kode sumber GHC.Base , kemungkinan implementasi
fmap
fungsi adalah yang disediakan olehMaybe
tipe data:dan implementasi lain yang mungkin adalah yang disediakan oleh tipe data 2-tupel
dan kemungkinan implementasi lainnya adalah yang disediakan oleh tipe data daftar (tentu saja!):
yang bergantung pada
map
fungsinya.Kesimpulan
The
map
fungsi dapat diterapkan untuk tidak lebih dari daftar nilai (di mana nilai-nilai dari jenis apa pun) sedangkanfmap
fungsi dapat diterapkan tipe data jauh lebih: semua orang yang termasuk kelas functor (misalnya maybes, tupel, daftar, dll ). Karena tipe data "daftar nilai" juga berfungsi (karena menyediakan implementasi untuknya), makafmap
dapat diterapkan juga menghasilkan hasil yang sama sepertimap
.sumber