Masalah utama RWH
Sudah tua. RWH ditulis pada saat GHC versi 6.8 sedang digunakan. 6.8 menggunakan versi dasar 3.0.xx 6.10.1 sudah menggunakan 4.0.0.0, yang memperkenalkan banyak perubahan . Dan itu hanya lompatan dari 6,8 menjadi 6,10. Versi GHC saat ini adalah 7.10. Monad telah diubah. Ada saat diskusi untuk menghapus return
dariMonad
, sehingga Monad
misalnya di Real World Haskell akan benar-benar menjadi tidak sinkron dengan dunia nyata.
Meskipun demikian, ini masih merupakan sumber yang berguna untuk pedoman umum. Namun perlu diingat bahwa banyak pustaka berubah sejak dirilis.
Sesuatu yang dapat Anda baca sambil membaca RWH adalah "Apa yang Saya Ingin Saya Ketahui Saat Belajar Haskell" oleh Stephen Diehl . Ini memberikan wawasan tambahan, tetapi perlu diketahui, beberapa bagian tidak benar-benar ramah pendatang baru.
Ucapan umum
- Baca komentarnya. Mereka biasanya berisi informasi apakah paragraf / bagian yang diberikan masih relevan dan / atau berfungsi.
- Baca dokumentasi pustaka / fungsi yang ingin Anda gunakan. Bahkan jika Anda malas, ketahuilah setidaknya tipenya.
Komentar untuk bab
Ini hanyalah gambaran singkat dari beberapa hal yang saya perhatikan saat membaca RWH. Ini mungkin tidak lengkap.
Bab 2. Jenis dan Fungsi vs FTP
Sejak GHC 7.10 .
Jenis null
telah diubah karena Foldable-Traversable-Proposal . Banyak fungsi lain seperti foldr
, foldl
dan banyak fungsi lain yang sebelumnya hanya ditetapkan [a]
di dalam Prelude
telah diganti dengan Foldable t => t a
varian yang lebih umum .
Sejak Haskell-platform 2010 atau akhir 2008.
Meskipun ini disebutkan dalam catatan kaki , pustaka QuickCheck telah berubah dalam banyak hal dari versi 1 ke versi 2. Misalnya, generate
sekarang menggunakan Gen a
alih-alih StdGen
, dan fungsionalitas yang lama generate
ada di Test.QuickCheck.Gen.unGen
.
Jika ragu, periksa dokumentasinya .
Bab 14. Monads & Bab 15. Pemrograman dengan monads
Pemecahan kode: Applicative m => Monad m
Pada GHC 7.10, Applicative
sekarang menjadi superclass Monad
, sesuatu yang tidak direncanakan pada tahun 2007.
Di GHC 7.10, Applicative
akan menjadi superclass dari Monad
, berpotensi memecahkan banyak kode pengguna. Untuk memudahkan transisi ini, GHC sekarang menghasilkan peringatan ketika definisi bertentangan dengan Proposal Aplikatif-Monad ( AMP ).
Lihat 7.8.1 catatan rilis .
The State
/ Writer
/ Reader
monad
Dalam Will keadaan sesungguhnya monad silakan berdiri? bagian, klaim penulis
Untuk mendefinisikan sebuah Monad
instance, kita harus menyediakan konstruktor tipe yang tepat serta definisi untuk (>>=)
dan return
. Ini membawa kita ke definisi sebenarnya dari State
.
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
Itu tidak benar lagi, karena State
dan teman-temannya sekarang diimplementasikan melalui
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
Jadi mereka ditentukan oleh trafo monad mereka.
Bab keseluruhan baik-baik saja, tetapi seperti yang dapat dibaca di komentar atau di blog Yuras Shumovich , bagian finalisator dalam kode berikut adalah praktik yang buruk:
pcre_ptr <- c_pcre_compile pattern (combineOptions flags) errptr erroffset nullPtr
if pcre_ptr == nullPtr
then do
err <- peekCString =<< peek errptr
return (Left err)
else do
reg <- newForeignPtr finalizerFree pcre_ptr -- release with free()
return (Right (Regex reg str))
Sebagaimana malloc()
harus digunakan dengan free()
, new
dengan delete
, allocate
dengan deallocate
, seseorang harus selalu menggunakan fungsi yang benar.
TL; DR Anda harus selalu mengosongkan memori dengan pengalokasi yang sama yang dialokasikan untuk Anda.
Jika fungsi asing mengalokasikan memori, Anda juga harus menggunakan fungsi deallocation yang menyertainya.
Penanganan kesalahan berubah total dari 6,8 menjadi 6,10, tetapi Anda sudah menyadarinya. Lebih baik baca dokumentasinya .
Beberapa contoh tampaknya rusak. Juga, ada pustaka HTTP lain yang tersedia.
Teknik pembuatan profil umum masih sama, dan contohnya (lihat di bawah) adalah studi kasus yang bagus untuk masalah yang dapat terjadi dalam program Anda. Tetapi RWH tidak memiliki profil multi-threaded, misalnya melalui ThreadScope. Juga, lazy IO tidak peduli di seluruh buku, sejauh yang saya tahu.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
Bab 24 & Bab 28 (Pemrograman bersamaan dan paralel & STM)
Sementara Bab 24. Pemrograman secara bersamaan dan multi inti serta Bab 28. Memori transaksional perangkat lunak masih relevan, buku Simon Marlow Parallel and Concurrent Programming di Haskell hanya berfokus pada pemrograman konkuren dan paralel dan cukup baru (2013). Pemrograman GPU dan repa sama sekali tidak ada di RWH.
Seperti bab-bab lainnya, pedoman umum perpustakaan desain masih ditulis dengan baik dan relevan. Namun karena adanya beberapa perubahan (?) Yang memprihatinkan ST
, hasilnya tidak dapat dikompilasi lagi.
Bab 27. Pemrograman jaringan
Sebagian besar masih up to date. Bagaimanapun, pemrograman jaringan tidak berubah dengan mudah. Namun, kode tersebut menggunakan fungsi yang tidak digunakan lagi bindSocket
dan sClose
, yang harus diganti oleh bind
dan close
(sebaiknya melalui impor yang memenuhi syarat). Ingatlah bahwa ini adalah tingkat yang sangat rendah, Anda mungkin ingin menggunakan perpustakaan tingkat tinggi yang lebih terspesialisasi.
GHC 6.8 adalah versi terakhir sebelum Platform Haskell diperkenalkan. Oleh karena itu, lampiran memberitahu Anda untuk mendapatkan GHC dan Cabal dengan tangan. Jangan. Sebagai gantinya, ikuti petunjuk di halaman unduh haskell.org .
Selain itu, lampiran tidak memberi tahu Anda tentang kotak pasir Cabal, yang diperkenalkan di Cabal 1.18 dan membebaskan Anda dari neraka ketergantungan . Dan tentu saja, stack
hilang sama sekali.
Konten hilang
Beberapa topik tidak dibahas sama sekali di RWH. Ini termasuk perpustakaan streaming seperti pipa dan saluran , dan juga lensa .
Ada beberapa sumber daya di luar sana untuk topik tersebut, tetapi berikut adalah beberapa tautan ke perkenalan untuk memberi Anda gambaran tentang topik tersebut. Juga, jika Anda ingin menggunakan vektor, gunakan vectors
paket.
Control.Applicative
RWH menggunakan Control.Applicative
's (<$>)
di beberapa poin, tetapi tidak menjelaskan Control.Applicative
sama sekali. LYAH dan Typeclassopedia berisi bagian tentang Applicative
. Mengingat itu Applicative
adalah kelas super Monad
(lihat di atas), disarankan untuk mempelajari kelas itu dengan hati.
Selain itu, beberapa operator Control.Applicative
(dan kelas tipe itu sendiri) sekarang menjadi bagian dari Prelude
, jadi pastikan bahwa operator Anda tidak bentrok dengan <$>
, <*>
dan lainnya.
Lensa
Perpustakaan streaming
Perkakas
- versi 1.18 dari Cabal, yang memperkenalkan kotak pasir
stack
, program lintas platform untuk mengembangkan proyek Haskell
ghc-mod
, backend untuk vim, emacs, Sublime Text, dan editor lainnya
Ekstensi bahasa baru / hilang dan perubahan GHC
- polimorfisme jenis waktu proses (
:i ($)
telah sangat berubah)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- ekstensi lainnya yang terjadi setelah 6.6