ประเด็นหลักของ RWH
มันเก่า. RWH ถูกเขียนขึ้นในช่วงเวลาที่มีการใช้ GHC เวอร์ชัน 6.8 6.8ใช้เวอร์ชันพื้นฐาน 3.0.xx 6.10.1 แล้วใช้ 4.0.0.0 ซึ่งมีการเปลี่ยนแปลงมากมาย และนั่นเป็นเพียงการกระโดดจาก 6.8 เป็น 6.10 GHC เวอร์ชันปัจจุบันคือ 7.10 เปลี่ยน Monads แล้ว ขณะนี้เป็นการอภิปรายที่จะลบออกreturn
จากMonad
ดังนั้นMonad
เช่นในโลกแห่งความจริง Haskell จริงๆจะออกจากซิงค์กับโลกแห่งความจริง
ดังที่กล่าวไว้ก็ยังคงเป็นแหล่งข้อมูลที่มีประโยชน์สำหรับหลักเกณฑ์ทั่วไป แต่โปรดทราบว่าห้องสมุดหลายแห่งมีการเปลี่ยนแปลงตั้งแต่เปิดตัว
สิ่งที่คุณสามารถอ่านไปพร้อมขณะที่อ่าน RWH คือ"สิ่งที่ผมอยากรู้ว่าเมื่อเรียนรู้ Haskell" โดยสตีเฟ่น Diehl ให้ข้อมูลเชิงลึกเพิ่มเติม แต่โปรดทราบว่าบางส่วนไม่เหมาะสำหรับผู้มาใหม่จริงๆ
ข้อสังเกตทั่วไป
- อ่านความคิดเห็น โดยปกติจะมีข้อมูลว่าย่อหน้า / ส่วนที่ระบุยังคงเกี่ยวข้องและ / หรือใช้งานได้หรือไม่
- อ่านเอกสารของไลบรารี / ฟังก์ชันที่คุณต้องการใช้ แม้ว่าคุณจะขี้เกียจ แต่อย่างน้อยก็ควรรู้ประเภท
ข้อสังเกตถึงบท
นี่เป็นเพียงภาพรวมคร่าวๆของบางสิ่งที่ฉันสังเกตเห็นขณะอ่าน RWH มันอาจจะไม่สมบูรณ์
บทที่ 2. ประเภทและหน้าที่เทียบกับ FTP
ตั้งแต่ GHC 7.10 .
ประเภทของการnull
ได้รับการเปลี่ยนแปลงเนื่องจากการพับ-ทะลุ-เสนอ ฟังก์ชั่นอื่น ๆ อีกมากมายเช่นfoldr
, foldl
และอื่น ๆ อีกมากมายที่ก่อนหน้านี้ถูกกำหนดเฉพาะ[a]
ในPrelude
ได้ถูกแทนที่ด้วยทั่วไปมากขึ้นFoldable t => t a
สายพันธุ์
ตั้งแต่ Haskell-platform 2010 หรือปลายปี 2008
แม้ว่านี่จะเป็นที่กล่าวถึงในเชิงอรรถห้องสมุด QuickCheck มีการเปลี่ยนแปลงในหลาย ๆ ด้านจากรุ่นที่ 1 ถึงรุ่นที่ 2 ตัวอย่างเช่นgenerate
ตอนนี้ใช้Gen a
แทนStdGen
และการทำงานของเดิมอยู่ในgenerate
Test.QuickCheck.Gen.unGen
มีข้อสงสัยให้ตรวจสอบเอกสาร
บทที่ 14. Monads & Chapter 15. การเขียนโปรแกรมด้วย monads
การทำลายรหัส: Applicative m => Monad m
สำหรับ GHC 7.10 Applicative
ตอนนี้เป็นซูเปอร์คลาสของMonad
สิ่งที่ไม่ได้วางแผนไว้ในปี 2550
ใน GHC 7.10 Applicative
จะกลายเป็นซูเปอร์คลาสที่Monad
อาจทำลายรหัสผู้ใช้จำนวนมาก เพื่อให้การเปลี่ยนแปลงนี้ง่ายขึ้น GHC จึงสร้างคำเตือนเมื่อคำจำกัดความขัดแย้งกับข้อเสนอเชิงบังคับ - โมนาด ( AMP )
ดู7.8.1 บันทึกประจำรุ่น
State
/ Writer
/ Reader
monads
ในโมนาดรัฐที่แท้จริงจะโปรดยืนขึ้นหรือไม่? ส่วนผู้เขียนอ้างว่า
เพื่อที่จะกำหนดMonad
เช่นเราจะต้องให้ตัวสร้างประเภทที่เหมาะสมเช่นเดียวกับคำจำกัดความและ(>>=)
นี้นำเราไปสู่ความหมายที่แท้จริงของreturn
State
-- file: ch14/State.hs
newtype State s a = State
runState :: s -> (a, s)
}
ไม่เป็นความจริงอีกต่อไปเพราะState
ตอนนี้และเพื่อน ๆ ของมันถูกใช้งานผ่านทาง
type State s = StateT s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity
ดังนั้นพวกมันจึงถูกกำหนดโดย monad transformer
บทโดยรวมนั้นดี แต่อย่างที่คุณสามารถอ่านได้ในความคิดเห็นหรือในบล็อกของ Yuras Shumovichส่วนสุดท้ายในรหัสต่อไปนี้เป็นการปฏิบัติที่ไม่ดี:
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))
ในฐานะที่malloc()
ควรจะใช้กับfree()
, new
กับdelete
, allocate
กับdeallocate
หนึ่งควรใช้ฟังก์ชั่นที่ถูกต้อง
TL; DR คุณควรเพิ่มหน่วยความจำโดยใช้ตัวจัดสรรเดียวกับที่จัดสรรให้คุณ
หากฟังก์ชันต่างประเทศจัดสรรหน่วยความจำคุณควรใช้ฟังก์ชันการจัดสรรตำแหน่งที่มาพร้อมกัน
การจัดการข้อผิดพลาดเปลี่ยนจาก 6.8 เป็น 6.10 โดยสิ้นเชิง แต่คุณสังเกตเห็นแล้ว ดีกว่าอ่านเอกสาร
บางส่วนของตัวอย่างดูเหมือนจะเสีย นอกจากนี้ยังมีไลบรารี HTTP อื่น ๆ
เทคนิคการสร้างโปรไฟล์ทั่วไปยังคงเหมือนเดิมและตัวอย่าง (ดูด้านล่าง) เป็นกรณีศึกษาที่ยอดเยี่ยมสำหรับปัญหาที่อาจเกิดขึ้นในโปรแกรมของคุณ แต่ RWH ไม่มีการทำโปรไฟล์แบบมัลติเธรดเช่นผ่าน ThreadScope นอกจากนี้ IO ที่ขี้เกียจไม่ได้กังวลตลอดทั้งเล่มเท่าที่ฉันรู้
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
บทที่ 24 และบทที่ 28 (การเขียนโปรแกรมพร้อมกันและแบบขนานและ STM)
ในขณะที่บทที่ 24. การเขียนโปรแกรมพร้อมกันและมัลติคอร์และบทที่ 28 หน่วยความจำธุรกรรมของซอฟต์แวร์ยังคงมีความเกี่ยวข้องหนังสือของ Simon Marlow Parallel and Concurrent Programming ใน Haskellมุ่งเน้นไปที่การเขียนโปรแกรมพร้อมกันและแบบขนานเท่านั้นและเป็นเรื่องล่าสุด (2013) การเขียนโปรแกรม GPU และ repa ขาดหายไปอย่างสิ้นเชิงใน RWH
เช่นเดียวกับบทอื่น ๆ หลักเกณฑ์ทั่วไปของไลบรารีการออกแบบยังคงเขียนได้ดีและมีความเกี่ยวข้อง อย่างไรก็ตามเนื่องจากมีการเปลี่ยนแปลงบางอย่าง (?) ที่เกี่ยวข้องST
จึงไม่สามารถรวบรวมผลลัพธ์ได้อีกต่อไป
บทที่ 27. การเขียนโปรแกรมเครือข่าย
ส่วนใหญ่ยังคงเป็นข้อมูลล่าสุด ท้ายที่สุดแล้วการเขียนโปรแกรมเครือข่ายไม่ได้เปลี่ยนไปง่ายๆ อย่างไรก็ตามโค้ดดังกล่าวใช้ฟังก์ชันที่เลิกใช้แล้วbindSocket
และsClose
ซึ่งควรถูกแทนที่ด้วยbind
และclose
(โดยเฉพาะอย่างยิ่งผ่านการนำเข้าที่มีคุณสมบัติเหมาะสม) โปรดทราบว่าเป็นระดับต่ำมากคุณอาจต้องการใช้ไลบรารีระดับสูงที่มีความเชี่ยวชาญมากขึ้น
GHC 6.8 เป็นเวอร์ชันสุดท้ายก่อนที่แพลตฟอร์ม Haskell จะเปิดตัว ดังนั้นภาคผนวกจึงบอกให้คุณรับ GHC และ Cabal ด้วยมือ อย่า. ให้ทำตามคำแนะนำในหน้าดาวน์โหลด haskell.org แทน
นอกจากนี้ภาคผนวกไม่ได้บอกคุณเกี่ยวกับเรียงราย Cabal ซึ่งถูกนำมาใช้ในCabal 1.18 และฟรีคุณจากนรกพึ่งพา และแน่นอนว่าstack
หายไปอย่างสมบูรณ์
ไม่มีเนื้อหา
บางหัวข้อไม่ได้กล่าวถึงใน RWH เลย ซึ่งรวมถึงไลบรารีสตรีมมิ่งเช่นท่อและท่อร้อยสายและเลนส์ด้วย
มีแหล่งข้อมูลมากมายสำหรับหัวข้อเหล่านั้น แต่นี่คือลิงค์ไปยังคำแนะนำเพื่อให้คุณทราบว่าพวกเขาเกี่ยวกับอะไร นอกจากนี้หากคุณต้องการใช้เวกเตอร์ให้ใช้vectors
แพ็คเกจ
Control.Applicative
ใช้ RWH Control.Applicative
's (<$>)
หลายจุด แต่ไม่ได้อธิบายControl.Applicative
ในทุก LYAHและTypeclassopediaApplicative
ประกอบด้วยส่วนที่เกี่ยวกับ เนื่องจากApplicative
เป็นซูเปอร์Monad
คลาส (ดูด้านบน) ขอแนะนำให้เรียนรู้ชั้นเรียนนั้นด้วยใจจริง
นอกจากนี้ผู้ประกอบการของหลายControl.Applicative
(และ typeclass เอง) ตอนนี้เป็นส่วนหนึ่งของPrelude
เพื่อให้แน่ใจว่าผู้ประกอบการของคุณไม่ได้ปะทะกับ<$>
, <*>
และอื่น ๆ
เลนส์
สตรีมไลบรารี
เครื่องมือ
- Cabal เวอร์ชัน 1.18 ซึ่งนำเสนอแซนด์บ็อกซ์
stack
โปรแกรมข้ามแพลตฟอร์มสำหรับการพัฒนาโครงการ Haskell
ghc-mod
แบ็กเอนด์สำหรับ vim, emacs, Sublime Text และโปรแกรมแก้ไขอื่น ๆ
ส่วนขยายภาษาใหม่ / หายไปและการเปลี่ยนแปลง GHC
- ความหลากหลายประเภทรันไทม์ (
:i ($)
มีการเปลี่ยนแปลงอย่างมาก)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- ส่วนขยายอื่น ๆ ที่เกิดขึ้นหลังจาก 6.6