ตอนนี้ Haskell โลกแห่งความจริงส่วนใดล้าสมัยหรือถือว่าเป็นการปฏิบัติที่ไม่ดี


107

ในบทที่ 19 ของReal World Haskellหลายตัวอย่างตอนนี้ล้มเหลวเนื่องจากการเปลี่ยนแปลงของControl.Exception.

นั่นทำให้ฉันคิดว่าบางสิ่งในหนังสือเล่มนี้อาจล้าสมัยไปแล้วและไม่คุ้มที่จะศึกษาอีกต่อไปหลังจากนั้นก็เป็นเวลา 6 ปี ข้อมูลอ้างอิงอื่น ๆ ของฉันคือLearn You a Haskell For Great Goodแม้ว่าจะเป็นหนังสือที่ยอดเยี่ยม แต่ก็มีพื้นฐานมากกว่าเมื่อเทียบกับ RWH

ใครที่เคยอ่านหนังสือมาก่อนช่วยแนะนำหน่อยได้ไหมว่าส่วนไหนที่ไม่เกี่ยวข้องอีกต่อไป โดยเฉพาะอย่างยิ่งบทในช่วงครึ่งหลังของหนังสือตัวอย่างเช่นหน่วยความจำธุรกรรมซอฟต์แวร์การเขียนโปรแกรมพร้อมกันการเขียนโปรแกรมซ็อกเก็ตเป็นต้น

แก้ไข: เป็นเรื่องเกี่ยวกับฉบับของหนังสือที่ตีพิมพ์ในเดือนธันวาคม 2551 ซึ่งเป็นฉบับเดียวที่รู้จัก ณ วันนี้ (พ.ย. 2017)


2
AFAIK เวอร์ชันออนไลน์ของReal World Haskellจะได้รับการอัปเดตเป็นครั้งคราว บางทีคุณอาจจะพบสิ่งที่มีประโยชน์มากขึ้นในHaskell วิกิตำรา
Vektorweg

@Vektorweg งานส่วนใหญ่ใน Wikibook จนถึงตอนนี้เสร็จสิ้นแล้วในบทแนะนำ (ซึ่งครอบคลุมพื้นที่เดียวกันกับระดับ LYAH แม้ว่าจะใช้เวลาที่แตกต่างกัน) และครอบคลุมทฤษฎีขั้นสูงและหัวข้อระบบ สำหรับปัญหาที่นำไปใช้ดังที่เห็นในบทต่อ ๆ ไปของ RWH swang อ้างถึง RWH เป็นทางเลือกที่ดีกว่าสำหรับตอนนี้ แม้ว่าในฐานะผู้สนับสนุน Wikibook ฉันหวังว่ามันจะเปลี่ยนไปในที่สุด :)
duplode

1
@Vektorweg: ฉันไม่ได้สังเกตเห็นความแตกต่างอย่างมีนัยสำคัญระหว่างการพิมพ์และเวอร์ชันออนไลน์ นอกจากนี้ดูเหมือนว่าเวอร์ชันออนไลน์จะไม่ได้รับการอัปเดตเลยบทตัวกรองบลูมพังไปนานแล้ว (อย่างน้อยปี 2009) ที่ถูกกล่าวว่า Wikibooks ใช่ :)
Zeta

1
@Swang หมายเหตุว่าแม้เรียนรู้ให้คุณมีความ Haskellมีสิ่งที่ล้าสมัยในขณะนี้ว่าMonadเป็น subclass Applicativeของ
jub0bs

1
กรุณาระบุฉบับของหนังสือ โดยทั่วไปมักจะพูดถึงรุ่น , แพลตฟอร์ม , OS , รุ่นฯลฯ เมื่อคุณพูดคุยเกี่ยวกับผลิตภัณฑ์!
Nawaz

คำตอบ:


137

ประเด็นหลักของ 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สายพันธุ์

บทที่ 11. การทดสอบและการประกันคุณภาพ

ตั้งแต่ 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

บทที่ 17. การเชื่อมต่อกับ C: FFI

บทโดยรวมนั้นดี แต่อย่างที่คุณสามารถอ่านได้ในความคิดเห็นหรือในบล็อกของ 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 คุณควรเพิ่มหน่วยความจำโดยใช้ตัวจัดสรรเดียวกับที่จัดสรรให้คุณ

หากฟังก์ชันต่างประเทศจัดสรรหน่วยความจำคุณควรใช้ฟังก์ชันการจัดสรรตำแหน่งที่มาพร้อมกัน

บทที่ 19. การจัดการข้อผิดพลาด

การจัดการข้อผิดพลาดเปลี่ยนจาก 6.8 เป็น 6.10 โดยสิ้นเชิง แต่คุณสังเกตเห็นแล้ว ดีกว่าอ่านเอกสาร

บทที่ 22. ตัวอย่างเพิ่มเติม: การเขียนโปรแกรมไคลเอ็นต์บนเว็บ

บางส่วนของตัวอย่างดูเหมือนจะเสีย นอกจากนี้ยังมีไลบรารี HTTP อื่น ๆ

บทที่ 25. การสร้างโปรไฟล์และการเพิ่มประสิทธิภาพ

เทคนิคการสร้างโปรไฟล์ทั่วไปยังคงเหมือนเดิมและตัวอย่าง (ดูด้านล่าง) เป็นกรณีศึกษาที่ยอดเยี่ยมสำหรับปัญหาที่อาจเกิดขึ้นในโปรแกรมของคุณ แต่ 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

บทที่ 26. การออกแบบห้องสมุดขั้นสูง: การสร้างตัวกรอง Bloom

เช่นเดียวกับบทอื่น ๆ หลักเกณฑ์ทั่วไปของไลบรารีการออกแบบยังคงเขียนได้ดีและมีความเกี่ยวข้อง อย่างไรก็ตามเนื่องจากมีการเปลี่ยนแปลงบางอย่าง (?) ที่เกี่ยวข้องSTจึงไม่สามารถรวบรวมผลลัพธ์ได้อีกต่อไป

บทที่ 27. การเขียนโปรแกรมเครือข่าย

ส่วนใหญ่ยังคงเป็นข้อมูลล่าสุด ท้ายที่สุดแล้วการเขียนโปรแกรมเครือข่ายไม่ได้เปลี่ยนไปง่ายๆ อย่างไรก็ตามโค้ดดังกล่าวใช้ฟังก์ชันที่เลิกใช้แล้วbindSocketและsCloseซึ่งควรถูกแทนที่ด้วยbindและclose(โดยเฉพาะอย่างยิ่งผ่านการนำเข้าที่มีคุณสมบัติเหมาะสม) โปรดทราบว่าเป็นระดับต่ำมากคุณอาจต้องการใช้ไลบรารีระดับสูงที่มีความเชี่ยวชาญมากขึ้น

ภาคผนวก A. การติดตั้งไลบรารี GHC และ Haskell

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

ขอบคุณนี่คือสิ่งที่ฉันเป็นจริงๆ :) คุณเตือนฉันเกี่ยวกับปัญหาสถานะโมนาดมันไม่มีตัวสร้างค่าสถานะอีกต่อไปทำให้ฉันเกาหัวเพื่อคิดว่าตอนที่ฉันอ่านมัน
swang

@swang: ยังห่างไกลจากความสมบูรณ์ บางทีไบรอันหรือดอนอาจรู้เพิ่มเติมเกี่ยวกับคุณสมบัติที่เปลี่ยนแปลง ไม่ว่าจะด้วยวิธีใดหลักเกณฑ์ทั่วไปยังคงมีอยู่
Zeta

1
สำหรับเครือข่ายระดับสูงผมชอบเครือข่ายง่าย
Lambda Fairy

มีความสัมพันธ์ระหว่าง "ทรานสดิวเซอร์" โครูทีนและสตรีมมิงไลบรารีไปป์ท่อร้อยสาย
CMCDragonkai

การใช้ HDBC ถือว่าล้าสมัยหรือไม่?
Janus Troelsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.