ฉันจะสั่งซื้อคู่มือนี้ตามระดับความสามารถที่คุณมีใน Haskell ตั้งแต่ระดับเริ่มต้นไปจนถึงระดับผู้เชี่ยวชาญ โปรดทราบว่ากระบวนการนี้จะใช้เวลาหลายเดือน (ปี?) ดังนั้นจึงค่อนข้างนาน
Absolute Beginner
ประการแรก Haskell มีความสามารถทุกอย่างและมีความสามารถเพียงพอ มันเร็วมาก (หลัง C และ C ++ เท่านั้นในประสบการณ์ของฉัน) และสามารถใช้ได้กับทุกอย่างตั้งแต่แบบจำลองไปจนถึงเซิร์ฟเวอร์ guis และเว็บแอปพลิเคชัน
อย่างไรก็ตามมีปัญหาบางอย่างที่ง่ายต่อการเขียนสำหรับผู้เริ่มต้นใน Haskell กว่าคนอื่น ๆ ปัญหาทางคณิตศาสตร์และรายการกระบวนการเป็นตัวเลือกที่ดีสำหรับเรื่องนี้เนื่องจากต้องการเพียงความรู้พื้นฐานของ Haskell ในการเขียนเท่านั้น
ประการแรกบางคำแนะนำที่ดีในการเรียนรู้พื้นฐานมากของ Haskell มีความสุขที่ได้เรียนรู้ Haskell กวดวิชาและ 6 บทแรกของการเรียนรู้คุณ Haskell ในขณะที่อ่านสิ่งเหล่านี้เป็นความคิดที่ดีมากที่จะแก้ปัญหาง่ายๆด้วยสิ่งที่คุณรู้
อีกสองแหล่งข้อมูลที่ดีจะHaskell Programming จากหลักการแรกและการเขียนโปรแกรมใน Haskell พวกเขาทั้งสองมาพร้อมแบบฝึกหัดสำหรับแต่ละบทดังนั้นคุณจึงมีปัญหาเล็ก ๆ น้อย ๆ ที่ตรงกับสิ่งที่คุณเรียนรู้ในสองสามหน้าสุดท้าย
รายการที่ดีของปัญหาที่จะลองเป็นHaskell ปัญหา 99 หน้า สิ่งเหล่านี้เริ่มต้นจากพื้นฐานขั้นพื้นฐานและยากขึ้นเมื่อคุณดำเนินการต่อ มันเป็นการฝึกฝนที่ดีมากในการทำหลายอย่างเนื่องจากมันจะช่วยให้คุณฝึกทักษะของคุณในการเรียกซ้ำและทำหน้าที่สั่งซื้อที่สูงขึ้น ฉันขอแนะนำให้ข้ามปัญหาใด ๆ ที่ต้องใช้การสุ่มเนื่องจากเป็นเรื่องยากขึ้นเล็กน้อยใน Haskell ตรวจสอบคำถาม SO นี้ในกรณีที่คุณต้องการทดสอบการแก้ปัญหาด้วย QuickCheck (ดูระดับกลางด้านล่าง)
เมื่อคุณทำบางอย่างเสร็จแล้วคุณสามารถดำเนินการต่อไปเพื่อแก้ไขปัญหาของProject Euler สิ่งเหล่านี้เรียงตามจำนวนคนที่ทำเสร็จซึ่งเป็นตัวบ่งชี้ที่ดีของความยากลำบาก สิ่งเหล่านี้ทดสอบตรรกะและ Haskell ของคุณมากกว่าปัญหาก่อนหน้านี้ แต่คุณควรทำสองสามอย่างแรกได้ ข้อได้เปรียบที่ยิ่งใหญ่ Haskell มีกับปัญหาเหล่านี้คือจำนวนเต็มไม่ จำกัด ขนาด เพื่อแก้ปัญหาเหล่านี้ให้สมบูรณ์จะเป็นประโยชน์หากคุณอ่านบทที่ 7 และ 8 เพื่อเรียนรู้ Haskell เช่นกัน
ผู้เริ่ม
หลังจากนั้นคุณควรมีการจัดการที่ดีพอสำหรับการเรียกซ้ำและฟังก์ชันการสั่งซื้อที่สูงขึ้นดังนั้นจึงเป็นเวลาที่ดีในการเริ่มทำปัญหาในโลกแห่งความเป็นจริง จุดเริ่มต้นที่ดีมากคือReal World Haskell (หนังสือออนไลน์คุณสามารถซื้อสำเนา) ฉันพบบทแรก ๆ ที่แนะนำมากเกินไปเร็วเกินไปสำหรับคนที่ไม่เคยทำงานเขียนโปรแกรมหรือใช้การเรียกใช้ซ้ำมาก่อน อย่างไรก็ตามด้วยการฝึกฝนที่คุณเคยมีจากการทำปัญหาก่อนหน้านี้คุณควรเข้าใจว่ามันสมบูรณ์แบบ
การแก้ไขปัญหาในหนังสือเป็นวิธีที่ดีในการเรียนรู้วิธีการจัดการ abstractions และการสร้างส่วนประกอบที่นำกลับมาใช้ใหม่ใน Haskell สิ่งนี้มีความสำคัญสำหรับคนที่เคยใช้การเขียนโปรแกรมเชิงวัตถุ (OO) เนื่องจากวิธีการ Abstraction OO (คลาส OO) ไม่ปรากฏใน Haskell (Haskell มีคลาสประเภท แต่แตกต่างจากคลาส Oo มากเช่นอินเทอร์เฟซ Oo ) ฉันไม่คิดว่ามันเป็นความคิดที่ดีที่จะข้ามบทต่าง ๆ เพราะแต่ละคนนำเสนอแนวคิดใหม่มากมายที่ใช้ในบทต่อ ๆ มา
หลังจากนั้นสักครู่คุณจะไปที่บทที่ 14 บทที่พระสงฆ์ที่น่าหวาดกลัว (dum dum dummmm) เกือบทุกคนที่เรียนรู้ Haskell มีปัญหาในการทำความเข้าใจกับพระเพราะแนวคิดเป็นนามธรรม ฉันไม่สามารถคิดถึงแนวคิดใด ๆ ในภาษาอื่นที่มีความเป็นนามธรรมเหมือนกับที่ monads อยู่ในการเขียนโปรแกรมใช้งานได้ Monads อนุญาตให้มีความคิดมากมาย (เช่นการปฏิบัติการ IO การคำนวณที่อาจล้มเหลวการแยกวิเคราะห์ ... ) เพื่อรวมเป็นหนึ่งเดียว ดังนั้นอย่ารู้สึกท้อแท้หากอ่านบทที่คุณไม่เข้าใจจริงๆ ฉันพบว่ามันมีประโยชน์ในการอ่านคำอธิบายต่าง ๆ มากมายของ monads; แต่ละคนให้มุมมองใหม่เกี่ยวกับปัญหา นี่คือสิ่งที่ดีมากรายการของบทเรียน monad ฉันขอแนะนำAll About Monadsแต่คนอื่น ๆ ก็ดี
นอกจากนี้ยังใช้เวลาสักครู่สำหรับแนวคิดที่จะจมอย่างแท้จริงสิ่งนี้มาจากการใช้งาน แต่เมื่อเวลาผ่านไป ฉันพบว่าบางครั้งการนอนหลับบนปัญหาช่วยได้มากกว่าสิ่งอื่นใด! ในที่สุดความคิดจะคลิกและคุณจะสงสัยว่าทำไมคุณพยายามเข้าใจแนวคิดที่ว่าในความเป็นจริงนั้นเรียบง่ายอย่างไม่น่าเชื่อ มันยอดเยี่ยมมากเมื่อเกิดเหตุการณ์นี้ขึ้นและเมื่อไหร่คุณจะพบว่า Haskell เป็นภาษาโปรแกรมที่คุณโปรดปราน :)
เพื่อให้แน่ใจว่าคุณกำลังทำความเข้าใจระบบการพิมพ์ Haskell ที่ดีที่สุดที่คุณควรพยายามที่จะแก้ปัญหา20 การออกกำลังกาย แบบฝึกหัดเหล่านั้นใช้ชื่อฟังก์ชั่นที่สนุกสนานเช่น "ขนยาว" และ "กล้วย" และช่วยให้คุณมีความเข้าใจที่ดีเกี่ยวกับแนวคิดการเขียนโปรแกรมฟังก์ชั่นพื้นฐานบางอย่างถ้าคุณยังไม่มี วิธีที่ดีในการใช้เวลายามเย็นของคุณด้วยเอกสารมากมายที่มีลูกศรยูนิคอร์นไส้กรอกและกล้วยขนยาว
สื่อกลาง
เมื่อคุณเข้าใจ Monads ฉันคิดว่าคุณได้เปลี่ยนจากโปรแกรมเมอร์ Haskell ไปเป็น Haskeller ระดับกลาง ดังนั้นจะไปจากที่นี่? สิ่งแรกที่ฉันอยากจะแนะนำ (ถ้าคุณยังไม่ได้เรียนรู้จากการเรียนรู้พระ) คือพระประเภทต่าง ๆ เช่น Reader, Writer และ State อีกครั้งโลกแห่งความเป็นจริง Haskell และทั้งหมดเกี่ยวกับพระให้ความคุ้มครองที่ดีนี้ เพื่อให้การฝึกอบรม Monad ของคุณเสร็จสิ้นการเรียนรู้เกี่ยวกับหม้อแปลง Monad เป็นสิ่งที่จำเป็น สิ่งเหล่านี้ช่วยให้คุณรวม Monads ประเภทต่าง ๆ (เช่น Reader และ State monad) ไว้ในที่เดียว นี่อาจดูเหมือนไร้ประโยชน์ที่จะเริ่มต้นด้วย แต่หลังจากใช้พวกเขาไประยะหนึ่งคุณจะสงสัยว่าคุณอยู่อย่างไรหากไม่มีพวกเขา
ตอนนี้คุณสามารถทำหนังสือ Haskell ในโลกแห่งความเป็นจริงได้หากคุณต้องการ การข้ามตอนนี้ไม่สำคัญเลยตราบใดที่คุณมีพระ เพียงแค่เลือกสิ่งที่คุณสนใจ
ด้วยความรู้ที่คุณมีอยู่ตอนนี้คุณควรจะสามารถใช้แพ็คเกจส่วนใหญ่บน cabal ได้ (อย่างน้อยก็เป็นเอกสารอย่างน้อย ... ) รวมถึงห้องสมุดส่วนใหญ่ที่มากับ Haskell รายการของห้องสมุดที่น่าสนใจที่ควรลองคือ:
Parsec : สำหรับการแยกวิเคราะห์โปรแกรมและข้อความ ดีกว่าการใช้ regexps เอกสารที่ยอดเยี่ยมยังมีบท Haskell โลกแห่งความจริง
QuickCheck : โปรแกรมทดสอบที่ยอดเยี่ยมมาก สิ่งที่คุณทำคือเขียนเพรดิเคตที่ควรเป็นจริงเสมอ (เช่นlength (reverse lst) == length lst
) จากนั้นคุณจะผ่านเพรดิเคต QuickCheck และจะสร้างค่าสุ่มจำนวนมาก (ในรายการกรณีนี้) และทดสอบว่าเพรดิเคตนั้นเป็นจริงสำหรับผลลัพธ์ทั้งหมด ดูเพิ่มเติมคู่มือออนไลน์
HUnit : การทดสอบหน่วยใน Haskell
gtk2hs : กรอบงาน gui ที่ได้รับความนิยมมากที่สุดสำหรับ Haskell ให้คุณเขียนแอปพลิเคชั่น gtk ใน Haskell
happstack : กรอบการพัฒนาเว็บสำหรับ Haskell ไม่ใช้ฐานข้อมูลแทนที่เก็บชนิดข้อมูล เอกสารที่ดีพอสมควร (กรอบงานยอดนิยมอื่น ๆ จะเป็นแบบsnapและyesod )
นอกจากนี้ยังมีแนวคิดมากมาย (เช่นแนวคิด Monad) ที่คุณควรเรียนรู้ในที่สุด นี่จะง่ายกว่าการเรียนรู้ Monads เป็นครั้งแรกเนื่องจากสมองของคุณจะถูกใช้เพื่อจัดการกับระดับของสิ่งที่เกี่ยวข้อง ภาพรวมที่ดีมากสำหรับการเรียนรู้เกี่ยวกับเหล่านี้แนวความคิดระดับสูงและวิธีที่พวกเขาพอดีกันเป็นTypeclassopedia
การใช้งาน: อินเทอร์เฟซเช่น Monads แต่มีประสิทธิภาพน้อยกว่า Monad ทุกคนสามารถใช้งานได้ แต่ไม่ใช่ในทางกลับกัน สิ่งนี้มีประโยชน์เนื่องจากมีบางประเภทที่ใช้งานได้ แต่ไม่ใช่ Monads นอกจากนี้โค้ดที่เขียนโดยใช้ฟังก์ชั่นการใช้งานนั้นมักจะแต่งได้มากกว่าการเขียนโค้ดที่เทียบเท่าโดยใช้ฟังก์ชั่น Monad ดูFunctors, Functors ประยุกต์และ Monoidsจากการเรียนรู้คำแนะนำของคุณ haskell
พับเก็บได้ , ทะลุ : Typeclasses ว่าหลายนามธรรมของการดำเนินงานของรายการเพื่อให้ฟังก์ชั่นเดียวกันสามารถนำไปใช้ประเภทภาชนะอื่น ๆ ดูเพิ่มเติมคำอธิบาย Haskell วิกิพีเดีย
หนังสือ : เป็นหนังสือเป็นชนิดที่มีศูนย์ (หรือ mempty) มูลค่าและการดำเนินงาน notated <>
ที่รวมสอง Monoids ร่วมกันเช่นว่าและx <> mempty = mempty <> x = x
x <> (y <> z) = (x <> y) <> z
สิ่งเหล่านี้เรียกว่ากฎหมายอัตลักษณ์และการเชื่อมโยง หลายชนิดมี Monoids เช่นหมายเลขด้วยและmempty = 0
<> = +
สิ่งนี้มีประโยชน์ในหลาย ๆ สถานการณ์
ลูกศร : ลูกศรเป็นวิธีแสดงการคำนวณที่รับอินพุตและส่งคืนเอาต์พุต ฟังก์ชั่นเป็นลูกศรประเภทพื้นฐานที่สุด แต่ก็มีอีกหลายประเภท ห้องสมุดยังมีฟังก์ชั่นที่มีประโยชน์มากมายสำหรับจัดการลูกศร - มันมีประโยชน์มากแม้ว่าจะใช้กับฟังก์ชั่น Haskell แบบเก่าเท่านั้น
อาร์เรย์ : อาร์เรย์ที่เปลี่ยนแปลงไม่แน่นอน / ไม่เปลี่ยนรูปแบบใน Haskell
ST Monad : ช่วยให้คุณเขียนรหัสด้วยสถานะที่ไม่แน่นอนที่ทำงานได้อย่างรวดเร็วในขณะที่ยังคงบริสุทธิ์อยู่นอก monad ดูลิงค์สำหรับรายละเอียดเพิ่มเติม
FRP: Functional Reactive Programming วิธีใหม่ในการเขียนโค้ดที่จัดการเหตุการณ์ทริกเกอร์อินพุตและเอาท์พุต (เช่น gui) ฉันไม่รู้อะไรเกี่ยวกับเรื่องนี้มาก พอล Hudak พูดถึง yampaเป็นการเริ่มต้นที่ดี
มีคุณสมบัติภาษาใหม่มากมายที่คุณควรดู ฉันเพิ่งจะแสดงพวกเขาคุณจะพบจำนวนของข้อมูลที่เกี่ยวกับพวกเขาจาก Google, Wikibook Haskell , เว็บไซต์ haskellwiki.org และเอกสาร GHC
- คลาสชนิดพารามิเตอร์หลายตัว / การพึ่งพาการทำงาน
- ประเภทครอบครัว
- ประเภทปริมาณเชิงปริมาณ
- ประเภทผี
- GADTS
- คนอื่น ๆ ...
Haskell มีทฤษฎีเกี่ยวกับหมวดหมู่เป็นจำนวนมากดังนั้นคุณอาจต้องการดูสิ่งนั้น ดีจุดเริ่มต้นคือทฤษฎีหมวดหมู่สำหรับนักวิทยาศาสตร์คอมพิวเตอร์ หากคุณไม่ต้องการซื้อหนังสือบทความที่เกี่ยวข้องของผู้เขียนก็ยอดเยี่ยมเช่นกัน
ในที่สุดคุณจะต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเครื่องมือ Haskell ต่างๆ เหล่านี้รวมถึง:
- ghc (และคุณสมบัติทั้งหมด)
- cabal : ระบบแพ็คเกจ Haskell
- darcs : ระบบควบคุมเวอร์ชันแบบกระจายเขียนใน Haskell ซึ่งเป็นที่นิยมมากสำหรับโปรแกรม Haskell
- haddock : เครื่องกำเนิดเอกสารอัตโนมัติ Haskell
ในขณะที่การเรียนรู้ห้องสมุดและแนวคิดใหม่ทั้งหมดเหล่านี้มีประโยชน์มากที่จะเขียนโครงการขนาดกลางใน Haskell มันอาจเป็นอะไรก็ได้ (เช่นเกมเล็ก ๆ เครื่องวิเคราะห์ข้อมูลเว็บไซต์คอมไพเลอร์ ) การทำงานกับสิ่งนี้จะช่วยให้คุณสามารถประยุกต์ใช้หลาย ๆ สิ่งที่คุณกำลังเรียนรู้อยู่ คุณอยู่ที่ระดับนี้สำหรับทุกวัย (นี่คือที่ฉันอยู่)
ผู้เชี่ยวชาญ
ต้องใช้เวลาหลายปีกว่าจะถึงจุดนี้ (สวัสดีปี 2009!) แต่จากตรงนี้ฉันเดาว่าคุณจะเริ่มเขียนเอกสารปริญญาเอกนามสกุล ghc ใหม่และมากับ abstractions ใหม่
ขอความช่วยเหลือ
ในที่สุดในขณะที่อยู่ในขั้นตอนของการเรียนรู้มีหลายสถานที่สำหรับรับข้อมูล เหล่านี้คือ:
- ช่อง #haskell irc
- รายชื่อผู้รับจดหมาย สิ่งเหล่านี้ควรค่าแก่การสมัครเพื่ออ่านการอภิปรายที่เกิดขึ้น - บางเรื่องน่าสนใจมาก
- สถานที่อื่น ๆ ที่ระบุไว้ในหน้าแรกของ haskell.org
ข้อสรุป
นี่กลับกลายเป็นนานกว่าที่ฉันคาดไว้ ... อย่างไรก็ตามฉันคิดว่ามันเป็นความคิดที่ดีที่จะมีความเชี่ยวชาญใน Haskell ใช้เวลานาน แต่ส่วนใหญ่เป็นเพราะคุณกำลังเรียนรู้วิธีการคิดแบบใหม่โดยการทำเช่นนั้น มันไม่เหมือนกับการเรียนรู้ Ruby หลังจากเรียนรู้ Java แต่เช่นเดียวกับการเรียนรู้ Java หลังจากเรียนรู้ C. นอกจากนี้ฉันพบว่าทักษะการเขียนโปรแกรมเชิงวัตถุของฉันได้รับการปรับปรุงจากการเรียนรู้ Haskell เมื่อฉันเห็นวิธีการใหม่ ๆ