Bagian mana dari Dunia Nyata Haskell yang sekarang sudah usang atau dianggap praktik yang buruk?

107

Di Bab 19 Dunia Nyata Haskell banyak contoh yang sekarang gagal karena perubahan Control.Exception.

Itu membuat saya berpikir mungkin beberapa hal di buku ini sebenarnya sudah usang dan tidak layak untuk dipelajari lagi, apalagi sudah 6 tahun. Satu-satunya referensi saya yang lain adalah Learn You a Haskell For Great Good , meskipun ini adalah buku yang bagus, itu jauh lebih mendasar dibandingkan dengan RWH.

Adakah yang bisa membaca buku ini sebelumnya, tolong beri beberapa saran tentang bagian mana yang tidak lagi relevan? Terutama bab-bab di paruh kedua buku, misalnya, memori transaksional perangkat lunak, pemrograman bersamaan, pemrograman soket, dll.

EDIT: Ini tentang edisi buku yang diterbitkan pada Desember 2008, yang merupakan satu-satunya edisi yang diketahui hingga hari ini (Nov 2017)

swang
sumber
2
AFAIK versi online Real World Haskell akan diperbarui dari waktu ke waktu. Mungkin Anda menemukan hal yang lebih berguna di Wikibook Haskell .
Vektorweg
@Vektorweg Sebagian besar pekerjaan di Wikibook sejauh ini dilakukan dalam bab pengantar (yang secara kasar mencakup bidang yang sama dengan tingkat LYAH, meskipun dengan pandangan yang berbeda) dan dalam cakupan topik teori dan sistem tipe yang lebih maju. Untuk isu-isu terapan, seperti yang terlihat di bab-bab selanjutnya dari RWH swang mengacu, RWH adalah pilihan yang lebih baik untuk saat ini; meskipun, sebagai kontributor Wikibook, saya berharap itu akan berubah pada akhirnya :)
duplode
1
@Vektorweg: Saya tidak melihat perbedaan yang signifikan antara versi cetak dan online. Juga, versi online sepertinya tidak diperbarui sama sekali, bab filter mekar telah rusak untuk waktu yang lama (setidaknya 2009). Itu dikatakan, Wikibooks, yay :).
Zeta
1
@Swang Perhatikan bahwa bahkan Learn You a Haskell berisi hal-hal usang, sekarang itu Monadadalah subclass dari Applicative.
jub0bs
1
Sebutkan edisi buku tersebut. Secara umum, selalu sebutkan versi , platform , OS , edisi dll ketika Anda berbicara tentang suatu produk!
Nawaz

Jawaban:

137

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 returndariMonad , sehingga Monadmisalnya 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 nulltelah diubah karena Foldable-Traversable-Proposal . Banyak fungsi lain seperti foldr, foldldan banyak fungsi lain yang sebelumnya hanya ditetapkan [a]di dalam Preludetelah diganti dengan Foldable t => t avarian yang lebih umum .

Bab 11. Pengujian dan jaminan kualitas

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, generatesekarang menggunakan Gen aalih-alih StdGen, dan fungsionalitas yang lama generateada 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, Applicativesekarang menjadi superclass Monad, sesuatu yang tidak direncanakan pada tahun 2007.

Di GHC 7.10, Applicativeakan 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/ Readermonad

Dalam Will keadaan sesungguhnya monad silakan berdiri? bagian, klaim penulis

Untuk mendefinisikan sebuah Monadinstance, 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 Statedan 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 17. Berinteraksi dengan C: FFI

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(), newdengan delete, allocatedengan 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.

Bab 19. Penanganan kesalahan

Penanganan kesalahan berubah total dari 6,8 menjadi 6,10, tetapi Anda sudah menyadarinya. Lebih baik baca dokumentasinya .

Bab 22. Contoh Tambahan: Pemrograman Klien Web

Beberapa contoh tampaknya rusak. Juga, ada pustaka HTTP lain yang tersedia.

Bab 25. Profil dan optimasi

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.

Bab 26. Desain perpustakaan tingkat lanjut: membangun filter Bloom

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 bindSocketdan sClose, yang harus diganti oleh binddan 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.

Lampiran A. Menginstal pustaka GHC dan Haskell

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, stackhilang 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 vectorspaket.

Control.Applicative

RWH menggunakan Control.Applicative's (<$>)di beberapa poin, tetapi tidak menjelaskan Control.Applicativesama sekali. LYAH dan Typeclassopedia berisi bagian tentang Applicative. Mengingat itu Applicativeadalah 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
Zeta
sumber
terima kasih, inilah yang saya cari :), Anda mengingatkan saya tentang masalah monad status, tidak lagi memiliki konstruktor nilai negara, membuat saya bingung untuk mencari tahu ketika saya membacanya.
swang
@swang: Ini masih jauh dari selesai. Mungkin Bryan atau Don tahu lebih banyak tentang fitur yang diubah. Bagaimanapun, pedoman umum masih berlaku.
Zeta
1
Untuk jaringan tingkat tinggi, saya lebih suka jaringan sederhana .
Lambda Fairy
Ada hubungan antara "transduser", coroutine, dan pipa perpustakaan streaming, saluran.
CMCDragonkai
Apakah penggunaan HDBC dianggap ketinggalan jaman?
Janus Troelsen