Phần nào của Real World Haskell hiện đã lỗi thời hoặc bị coi là hoạt động xấu?


107

Trong chương 19 của Real World Haskell, rất nhiều ví dụ hiện không thành công do sự thay đổi của Control.Exception.

Điều đó khiến tôi nghĩ rằng có lẽ một số nội dung trong cuốn sách này thực sự đã lỗi thời và không còn đáng để nghiên cứu nữa, dù sao thì cũng đã 6 năm rồi. Tài liệu tham khảo duy nhất khác của tôi là Learn You a Haskell For Great Good , mặc dù đó là một cuốn sách tuyệt vời, nó cơ bản hơn nhiều so với RWH.

Ai đã đọc cuốn sách trước đây có thể cho một vài lời khuyên về những phần nào của nó không còn phù hợp không? Đặc biệt là các chương trong nửa sau của cuốn sách, ví dụ, bộ nhớ giao dịch phần mềm, lập trình đồng thời, lập trình socket, v.v.

CHỈNH SỬA: Đây là về ấn bản của cuốn sách được xuất bản vào tháng 12 năm 2008, là ấn bản duy nhất được biết đến cho đến ngày hôm nay (tháng 11 năm 2017)


2
AFAIK, phiên bản trực tuyến của Real World Haskell sẽ được cập nhật theo thời gian. Có thể bạn tìm thấy nhiều nội dung hữu ích hơn trong Haskell Wikibook .
Vektorweg

@Vektorweg Hầu hết công việc trên Wikibook cho đến nay đều được thực hiện trong các chương giới thiệu (đại khái bao gồm cơ sở giống như cấp độ LYAH, mặc dù với một cách khác) và bao gồm các chủ đề lý thuyết và loại hệ thống nâng cao hơn. Đối với các vấn đề áp dụng, như đã thấy trong các chương sau của RWH mà swang đề cập, RWH là sự lựa chọn tốt hơn cho bây giờ; mặc dù, với tư cách là người đóng góp cho Wikibook, tôi hy vọng điều đó cuối cùng sẽ thay đổi :)
duplode

1
@Vektorweg: Tôi không nhận thấy sự khác biệt đáng kể giữa bản in và bản trực tuyến. Ngoài ra, phiên bản trực tuyến dường như không được cập nhật chút nào, chương bộ lọc bloom đã bị hỏng từ lâu (ít nhất là năm 2009). Điều đó đang được nói, Wikibooks, yay :).
Zeta

1
@Swang Lưu ý rằng ngay cả Learn You a Haskell cũng chứa những thứ lỗi thời, bây giờ nó Monadlà một lớp con của Applicative.
joong0bs

1
Hãy đề cập đến ấn bản của cuốn sách. Nói chung, luôn đề cập đến phiên bản , nền tảng , hệ điều hành , phiên bản , v.v. khi bạn nói về một sản phẩm!
Nawaz

Câu trả lời:


137

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 returnkhỏiMonad , vì vậy Monadphiê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, foldlvà 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 acác biến thể tổng quát hơn .

Chương 11. Kiểm tra và đảm bảo chất lượng

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ụ: generatebây giờ sử dụng Gen athay vì StdGenvà chức năng của cũ generatevẫ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, Applicativebâ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, Applicativesẽ 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/ Readermonads

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 Monadthể 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 (>>=)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ì Statevà 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 17. Giao diện với C: FFI

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(), newvới delete, allocatevớ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.

Chương 19. Xử lý lỗi

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 .

Chương 22. Ví dụ mở rộng: Lập trình máy khách web

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.

Chương 25. Lập hồ sơ và tối ưu hóa

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õiChươ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.

Chương 26. Thiết kế thư viện nâng cao: xây dựng bộ lọc Bloom

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 bindSocketsClosenên được thay thế bằng bindclose(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.

Phụ lục A. Cài đặt thư viện GHC và Haskell

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, stacklà 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ố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 vectorsgói.

Control.Applicative

RWH sử dụng Control.Applicative's (<$>)ở một số điểm, nhưng không giải thích Control.Applicativegì cả. LYAHTypeclassopedia chứa các phần trên Applicative. Vì đó Applicativelà 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

cảm ơn, đây chính xác là những gì tôi đã theo dõi :), bạn nhắc nhở tôi về vấn đề đơn nguyên trạng thái, nó không còn có hàm tạo giá trị Trạng thái nữa, khiến tôi phải vò đầu bứt tai để tìm ra khi tôi đang đọc nó.
swang

@swang: Vẫn còn lâu mới hoàn thành. Có lẽ Bryan hoặc Don biết thêm về các tính năng đã thay đổi. Dù bằng cách nào, các hướng dẫn chung vẫn được giữ nguyên.
Zeta

1
Đối với mạng cấp cao, tôi thích mạng đơn giản hơn .
Lambda Fairy

Có một mối quan hệ giữa "đầu dò", coroutines và các đường ống thư viện trực tuyến, ống dẫn.
CMCDragonkai

HDBC sử dụng có bị coi là lỗi thời không?
Janus Troelsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.