ประเด็นหลักของ 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และการทำงานของเดิมอยู่ในgenerateTest.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/ Readermonads
ในโมนาดรัฐที่แท้จริงจะโปรดยืนขึ้นหรือไม่? ส่วนผู้เขียนอ้างว่า
เพื่อที่จะกำหนดMonadเช่นเราจะต้องให้ตัวสร้างประเภทที่เหมาะสมเช่นเดียวกับคำจำกัดความและ(>>=) นี้นำเราไปสู่ความหมายที่แท้จริงของreturnState
-- 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