Apakah ada alasan bagus mengapa tipe Prelude.read itu
read :: Read a => String -> a
daripada mengembalikan Maybe
nilai?
read :: Read a => String -> Maybe a
Karena string mungkin gagal diuraikan Haskell, bukankah yang terakhir lebih natural?
Atau bahkan Either String a
, di mana Left
akan berisi string asli jika tidak diurai, dan Right
hasilnya jika demikian?
Edit:
Saya tidak mencoba membuat orang lain menulis bungkus yang sesuai untuk saya. Hanya mencari kepastian bahwa melakukannya aman.
take
menerimanyaNum a => a
? Mengapa ada kasus khususfmap
untuk daftar? MengapaFunctor
tidak diperlukan untukMonad
contoh? Saya berharap jawabannya serupa dengan jawaban atas pertanyaan ini dan pertanyaan terkait.readMaybe
fungsi akan segera ditambahkan.take
menjadiIntegral n => n -> [a] -> [a]
?Integral
, bukanNum
- otak kentut.Jawaban:
Edit : Mulai GHC 7.6,
readMaybe
tersedia diText.Read
modul dalam paket dasar, bersama denganreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: readMaybePertanyaan bagus! Jenis pembacaan itu sendiri tidak berubah dalam waktu dekat karena itu akan merusak banyak hal. Namun, harus ada
maybeRead
fungsi.Kenapa tidak ada? Jawabannya adalah "inersia". Ada sebuah diskusi di tahun '08 yang digagalkan oleh diskusi tentang "gagal."
Kabar baiknya adalah bahwa orang-orang cukup yakin untuk mulai menjauh dari kegagalan di perpustakaan. Kabar buruknya adalah bahwa lamaran itu hilang dalam pengacakan. Ada harus menjadi fungsi seperti, meskipun satu mudah untuk menulis (dan ada zillions versi sangat mirip mengambang sekitar banyak codebases).
Lihat juga pembahasan ini .
Secara pribadi, saya menggunakan versi dari paket aman .
sumber
Ya, ini akan berguna dengan fungsi baca yang mengembalikan Maybe. Anda dapat membuatnya sendiri:
sumber
Read a
tipe:readMaybe :: Read a => String -> Maybe a
Terlepas dari kelembaman dan / atau perubahan wawasan, alasan lain mungkin karena secara estetika menyenangkan memiliki fungsi yang dapat bertindak sebagai semacam kebalikan dari
show
. Artinya, yang Anda inginkanread . show
adalah identitas (untuk tipe yang merupakan turunan dariShow
danRead
) dan itushow . read
adalah identitas pada kisaranshow
(yaitushow . read . show == show
)Memiliki
Maybe
tipe aread
mematahkan simetri denganshow :: a -> String
.sumber
newtype ValidShow a = ValidShow String
. Tipe phantom membuatnya lebih aman untuk tipe.showThing :: Show a => a -> ValidShow a
danreadThing :: Read a => ValidShow a -> a
, sehingga jenis hal yang ditampilkan diingat dalam objek ValidShow. Dengan cara ini Anda tidak bisa menulisreadThing (showThing True) :: String
.Seperti yang ditunjukkan @augustss, Anda dapat membuat fungsi baca aman Anda sendiri. Namun, perintahnya
readMaybe
tidak sepenuhnya konsisten dengan read, karena tidak mengabaikan spasi di akhir string. (Saya melakukan kesalahan ini sekali, saya tidak begitu ingat konteksnya)Melihat definisi read dalam laporan Haskell 98 , kita dapat memodifikasinya untuk mengimplementasikan
readMaybe
yang sangat konsistenread
, dan ini tidak terlalu merepotkan karena semua fungsi yang bergantung padanya didefinisikan dalam Prelude:sumber
safe
paket tersebut, Anda akan mendapatkan versi yang benar dari yangreadMaybe
tersedia (disebutreadMay
dan identik dengan versi ini.Fungsi ini (disebut
readMaybe
) sekarang ada di pendahuluan Haskell! (Pada basis saat ini - 4.6)sumber