Vấn đề chính của SKSS
No cu. RWH được viết vào thời điểm phiên bản 6.8 của GHC đang được sử dụng. 6.8 đã sử dụng phiên bản cơ sở 3.0.xx 6.10.1 đã được sử dụng 4.0.0.0, đã giới thiệu nhiều thay đổi . Và đó chỉ là bước nhảy từ 6,8 lên 6,10. Phiên bản hiện tại của GHC là 7.10. Môn phái đã được thay đổi. Hiện đang có một cuộc thảo luận để xóa return
khỏiMonad
, vì vậy Monad
phiên bản trong Real World Haskell sẽ thực sự không đồng bộ với thế giới thực.
Tuy nhiên, nó vẫn là một nguồn hữu ích cho các hướng dẫn chung. Nhưng hãy nhớ rằng nhiều thư viện đã thay đổi kể từ khi phát hành.
Một điều bạn có thể đọc cùng khi đọc RWH là "Điều tôi ước tôi biết khi học Haskell" của Stephen Diehl . Nó cung cấp thêm thông tin chi tiết, nhưng hãy lưu ý, một số phần không thực sự thân thiện với người mới.
Nhận xét chung
- Đọc các bình luận. Chúng thường chứa thông tin liệu đoạn / phần đã cho có còn phù hợp và / hoặc hoạt động hay không.
- Đọc tài liệu về các thư viện / chức năng bạn muốn sử dụng. Ngay cả khi bạn lười biếng, hãy biết ít nhất các kiểu.
Chú thích cho các chương
Đây chỉ là một cái nhìn tổng quan nhanh về một số điều mà tôi nhận thấy khi đọc RWH. Nó có lẽ không hoàn chỉnh.
Chương 2. Các loại và chức năng so với FTP
Kể từ GHC 7.10 .
Loại của null
đã được thay đổi do Đề xuất có thể gập lại-có thể chuyển đổi . Nhiều chức năng khác như foldr
, foldl
và nhiều chức năng khác trước đây chỉ được định nghĩa [a]
trong Prelude
đã được thay thế bằng Foldable t => t a
các biến thể tổng quát hơn .
Kể từ nền tảng Haskell 2010 hoặc cuối năm 2008.
Mặc dù điều này được đề cập trong phần chú thích cuối trang , nhưng thư viện QuickCheck đã thay đổi theo nhiều cách từ phiên bản 1 sang phiên bản 2. Ví dụ: generate
bây giờ sử dụng Gen a
thay vì StdGen
và chức năng của cũ generate
vẫn có Test.QuickCheck.Gen.unGen
.
Nếu nghi ngờ, hãy kiểm tra tài liệu .
Chương 14. Đơn nguyên & Chương 15. Lập trình với đơn nguyên
Phá mã: Applicative m => Monad m
Kể từ GHC 7.10, Applicative
bây giờ là một lớp cha của Monad
, thứ không được lên kế hoạch vào năm 2007.
Trong GHC 7.10, Applicative
sẽ trở thành lớp cha của Monad
, có khả năng phá vỡ rất nhiều mã người dùng. Để giảm bớt quá trình chuyển đổi này, GHC hiện tạo cảnh báo khi các định nghĩa xung đột với Đề xuất đơn nguyên áp dụng ( AMP ).
Xem ghi chú phát hành 7.8.1 .
Các State
/ Writer
/ Reader
monads
Trong Will nhà nước đơn nguyên xin hãy đứng lên? phần, các tác giả tuyên bố
Để định nghĩa một Monad
thể hiện, chúng ta phải cung cấp một phương thức khởi tạo kiểu thích hợp cũng như các định nghĩa cho (>>=)
và return
. Điều này dẫn chúng ta đến định nghĩa thực sự của State
.
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
Điều đó không còn đúng nữa, bởi vì State
và bạn bè của nó hiện được triển khai thông qua
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
Vì vậy, chúng được xác định bởi máy biến áp đơn nguyên của chúng.
Chương tổng thể là tốt, nhưng như người ta có thể đọc trong các nhận xét hoặc trên blog của Yuras Shumovich , phần hoàn thiện trong đoạn mã sau là một phương pháp không tốt:
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))
Như malloc()
nên được sử dụng với free()
, new
với delete
, allocate
với deallocate
, luôn luôn phải sử dụng đúng chức năng.
TL; DR Bạn phải luôn giải phóng bộ nhớ bằng cùng một bộ phân bổ đã cấp nó cho bạn.
Nếu một hàm ngoại phân bổ bộ nhớ, bạn cũng nên sử dụng hàm phân bổ đi kèm.
Xử lý lỗi đã thay đổi hoàn toàn từ 6.8 thành 6.10, nhưng bạn đã nhận thấy điều đó. Tốt hơn hãy đọc tài liệu .
Một số ví dụ dường như bị hỏng. Ngoài ra, có sẵn các thư viện HTTP khác.
Các kỹ thuật lập hồ sơ chung vẫn giống nhau, và ví dụ (xem bên dưới) là một nghiên cứu điển hình tuyệt vời cho các vấn đề có thể xảy ra trong chương trình của bạn. Nhưng RWH thiếu cấu hình đa luồng, ví dụ như thông qua ThreadScope. Ngoài ra, IO lười biếng không được quan tâm trong toàn bộ cuốn sách, theo như tôi biết.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
Chương 24 & Chương 28 (Lập trình đồng thời và song song & STM)
Trong khi Chương 24. Lập trình đồng thời và đa lõi và Chương 28. Bộ nhớ giao dịch phần mềm vẫn còn phù hợp, thì cuốn sách Lập trình song song và đồng thời của Simon Marlow ở Haskell chỉ tập trung vào lập trình đồng thời và song song và khá gần đây (2013). Lập trình GPU và repa hoàn toàn bị thiếu trong RWH.
Cũng như các chương khác, các hướng dẫn chung của thư viện thiết kế vẫn được viết tốt và phù hợp. Tuy nhiên, do một số thay đổi (?) Liên quan ST
, kết quả không thể được biên dịch nữa.
Chương 27. Lập trình mạng
Nó hầu như vẫn được cập nhật. Rốt cuộc, lập trình mạng không thay đổi dễ dàng như vậy. Tuy nhiên, mã sử dụng các hàm không dùng nữa bindSocket
và sClose
nên được thay thế bằng bind
và close
(tốt nhất là thông qua nhập đủ điều kiện). Hãy nhớ rằng nó ở cấp rất thấp, bạn có thể muốn sử dụng một thư viện cấp cao chuyên biệt hơn.
GHC 6.8 là phiên bản cuối cùng trước khi Nền tảng Haskell được giới thiệu. Vì vậy, phụ lục cho bạn biết để lấy GHC và Cabal bằng tay. Đừng. Thay vào đó, hãy làm theo hướng dẫn trên trang tải xuống haskell.org .
Ngoài ra, phần phụ lục không cho bạn biết về hộp cát Cabal, đã được giới thiệu trong Cabal 1.18 và giải phóng bạn khỏi địa ngục phụ thuộc . Và tất nhiên, stack
là mất tích hoàn toàn.
Thiếu nội dung
Một số chủ đề hoàn toàn không được thảo luận trong RWH. Điều này bao gồm các thư viện phát trực tuyến như ống dẫn và ống dẫn và cả ống kính .
Có một số tài nguyên có sẵn cho các chủ đề đó, nhưng đây là một số liên kết đến phần giới thiệu để cung cấp cho bạn ý tưởng về chúng. Ngoài ra, nếu bạn muốn sử dụng vectơ, hãy sử dụng vectors
gói.
Control.Applicative
RWH sử dụng Control.Applicative
's (<$>)
ở một số điểm, nhưng không giải thích Control.Applicative
gì cả. LYAH và Typeclassopedia chứa các phần trên Applicative
. Vì đó Applicative
là lớp cha của Monad
(xem ở trên), bạn nên học thuộc lớp đó.
Bên cạnh đó, một số nhà khai thác của Control.Applicative
(và typeclass tự) bây giờ là một phần của Prelude
, do đó hãy chắc chắn rằng các nhà khai thác của bạn không xung đột với <$>
, <*>
và những người khác.
Ống kính
Thư viện truyền trực tuyến
Dụng cụ
- phiên bản 1.18 của Cabal, giới thiệu hộp cát
stack
, một chương trình đa nền tảng để phát triển các dự án Haskell
ghc-mod
, chương trình phụ trợ cho vim, emacs, Sublime Text và các trình soạn thảo khác
Tiện ích mở rộng ngôn ngữ mới / bị thiếu và thay đổi GHC
- đa hình kiểu thời gian chạy (
:i ($)
đã thay đổi rất nhiều)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- bất kỳ phần mở rộng nào khác xảy ra sau ngày 6.6