เริ่มต้นกับ Haskell


755

สองสามวันที่ฉันพยายามล้อมรอบกระบวนทัศน์การเขียนโปรแกรมการทำงานใน Haskell ฉันได้ทำสิ่งนี้โดยการอ่านบทช่วยสอนและดูหน้าจอ screencasts แต่ดูเหมือนว่าไม่มีอะไรจะติด ตอนนี้ในการเรียนรู้ภาษาที่จำเป็นต่างๆ / OO (เช่น C, Java, PHP) การออกกำลังกายเป็นวิธีที่ดีสำหรับฉันที่จะไป แต่เนื่องจากฉันไม่รู้จริง ๆ ว่า Haskell มีความสามารถอะไรและเนื่องจากมีแนวคิดใหม่มากมายที่จะใช้ฉันจึงไม่รู้ว่าจะเริ่มจากตรงไหน

ดังนั้นคุณเรียนรู้ Haskell ได้อย่างไร อะไรทำให้คุณ "แตกน้ำแข็ง" จริงๆ? นอกจากนี้ยังมีแนวคิดที่ดีสำหรับการฝึกหัดเริ่มต้นไหม?


คำตอบ:


2476

ฉันจะสั่งซื้อคู่มือนี้ตามระดับความสามารถที่คุณมีใน 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 เมื่อฉันเห็นวิธีการใหม่ ๆ


35
ลูกศร Yay! ครั้งแรกที่คุณปล่อยให้พระสงฆ์หล่อหลอมสมองของคุณจากนั้นยืนบนหัวของคุณและคิดเกี่ยวกับ comonads จากนั้นคุณก็ทำทั้งสองอย่างพร้อมกันเพื่อรับลูกศร :) มีพลังในการแสดงออกมากมายใน Haskell ที่สามารถเปิดได้ด้วยระดับประเภท การเขียนโปรแกรมเช่นกัน
ephemient

13
@ Nanothief Monadมีประสิทธิภาพมากกว่า แต่มีองค์ประกอบน้อยกว่า ... ผู้คนจำนวนมากใช้พระที่พวกเขาสามารถกำจัดApplicativeโค้ดที่สะอาดได้ สิ่งต่าง ๆ ส่วนใหญ่ที่เป็นFunctorของMonads แต่คุณไม่ได้ใช้>>=และreturnเมื่อfmapจะพอเพราะหลังนำไปสู่รหัสที่ง่ายกว่าถ้าคุณสามารถใช้
Tom Crockett

8
@pelotom ฉันได้เพิ่มลิงก์ typeclassopedia รวมถึงเหตุผลที่ดีกว่าในการใช้ Applicative ในส่วนนั้นและลบส่วน Functor เป็นการยากที่จะได้แนวคิดของ Monad และ Applicative ในลำดับที่ถูกต้องเนื่องจากเน้นที่ Monads ในสื่อการสอนส่วนใหญ่ (รวมถึง RWH) ในทางตรงกันข้ามการสอนให้คุณสอน haskell นั้นมีมานานแล้วตั้งแต่แรกที่ฉันเขียนคำตอบ (เกือบ 2 ปี: O) และสอนผู้สมัครก่อน Monad บางทีนั่นอาจเป็นวิธีที่แนะนำในการเรียนรู้ haskell
David Miani

2
คำแนะนำที่ดี ฉันเริ่มเรื่องนี้เมื่อปีที่แล้วและเกือบจะผ่านเวทีระดับกลางไปแล้ว คำติชม: บท Monad ของ RWH (บทที่ 14) มีการอธิบายไม่ดี การอ่านเวอร์ชั่นออนไลน์ของ RWH นั้นมีประโยชน์เพราะมันมีความคิดเห็นมากมายที่ช่วยในบทนี้ FWIW คุณน่าจะประดิษฐ์ Monads ขึ้นมาเป็นแบบฝึกหัด monad ที่ดีที่สุดสำหรับฉัน
Tom

6
@tomf: ขอบคุณ! ฉันประหลาดใจเสมอที่คำตอบนี้ทำได้ดีมาก - มันเกือบห้าปีแล้วที่ฉันเขียน แต่มันยังคงแข็งแกร่ง ฉันจะต้องทำการอัปเดตให้เร็ว ๆ นี้เนื่องจากเป็นบิตที่ล้าสมัย ไม่ได้พูดถึงเลนส์ท่อชนิด จำกัด แพลตฟอร์ม Haskell หมายเลขระดับประเภทและเป็นหัวข้อใหม่ที่สำคัญนับตั้งแต่มีการเขียน คุณพูดถูกว่า RWH ไม่ดีอีกต่อไป แต่มันไม่ได้รับการปรับปรุงในเวลานานและตัวอย่างจำนวนมากไม่ได้รวบรวม ฉันดีใจที่ยังเป็นประโยชน์กับคุณอยู่ดี
David Miani

179

เพื่อนร่วมงานของฉันบางคนมีประสบการณ์ที่ดีกับLearn You a Haskell for Great Good! .

การสอนมีวัตถุประสงค์เพื่อผู้ที่มีประสบการณ์ในการเขียนโปรแกรมภาษาที่จำเป็น แต่ยังไม่ได้ตั้งโปรแกรมในภาษาที่ใช้งานได้มาก่อน

และตรวจสอบคำตอบที่นี่ด้วย


27
ฉันที่สองนี้ นอกจากนี้เนื่องจากไม่ชัดเจนต่อไปนี้เป็นลิงก์ไปยังเวอร์ชันไฟล์ PDF ของบทช่วยสอนที่ดาวน์โหลดได้: learnyouahaskell.com/learnyouahaskell.pdfการออกแบบเว็บนั้นยอดเยี่ยม แต่ฉันก็อยากมีสำเนาสำหรับรถไฟใต้ดินด้วย
Telemachus

8
ฉันเริ่มต้นด้วยสิ่งนี้ แต่ความเห็นของฉันคือคุณควรไปที่ Real World Haskell โดยตรง ความแตกต่างก็เหมือนกับการเรียนรู้ C จาก K&R หรือ "C for dummies" ซึ่งพยายามที่จะง่าย แต่พลาดสิ่งสำคัญด้วยวิธีการของมัน ฉันคิดว่าเป็นการดีกว่าที่จะรับข้อเท็จจริงโดยตรงแทนที่จะพยายามเรียนรู้ Haskell "วิธีการที่จำเป็น"
John Smith

7
ฉันรักสิ่งนี้อย่างมากและฉันได้ทุ่มเทเวลาไปกับสิ่งนี้และ Real World Haskell IMO "Learn You a Haskell" ให้ข้อมูลเชิงลึกที่ลึกกว่า Real World Haskell แม้ว่าพวกเขาจะเป็นแหล่งข้อมูลที่ดี
Charlie ดอกไม้

7
@ abababa22 ฉันคิดว่าการอ่าน LYAH ก่อนแล้วจึงไปที่ RWH เป็นความคิดที่ดีที่สุด LYAH ไม่ได้สอนแค่ Haskell มันสอนให้คุณเขียนโปรแกรมการทำงาน คุณเริ่มคิดด้วยวิธีการทำงานเมื่อคุณแก้ปัญหา เห็นได้ชัดว่ามีเพียง LYAH เท่านั้นที่จะไม่สามารถเขียนแอปพลิเคชันขนาดใหญ่ได้ หากคุณมาจากพื้นหลังที่จำเป็นนี่เป็นวิธีที่ดีที่สุด IMO
Abdulsattar Mohammed

4
@ Telemachus เพียงเพื่อทราบ: PDF ไม่ได้เป็นรุ่นสุดท้ายอย่างน้อยก็หายไปบทสุดท้าย
sdcvvc

103

นี่คือหนังสือที่ดีที่คุณสามารถอ่านออนไลน์ได้: Real World Haskell

ส่วนใหญ่ของโปรแกรม Haskell ฉันได้ทำได้รับการแก้โครงการออยเลอร์ปัญหา

เมื่อคำแนะนำบางส่วนที่ฉันอ่านไม่นานมานี้คือคุณควรมีปัญหาง่าย ๆ ที่เป็นมาตรฐานที่คุณรู้วิธีแก้ปัญหา (ในทางทฤษฎี) แล้วเมื่อใดก็ตามที่คุณพยายามเรียนรู้ภาษาใหม่ที่คุณใช้ปัญหาเหล่านั้นในภาษานั้น


2
Real World Haskell ในประสบการณ์ของฉันยอดเยี่ยมจนกระทั่งคุณมาถึงบทที่ 5 ต่อจากนี้ไปฉันจะไม่แนะนำ
MasterMastic

ทำไมต้อง @MasterMastic อะไรคือปัญหาที่นอกเหนือจากบทที่ 5 ฉันต้องการที่จะรู้ก่อนที่จะใช้จ่ายเงิน
Jay Blanchard

@ JayBlanchard ในบทที่ 5 คุณเริ่มได้รับตัวอย่างที่เป็นรูปธรรมของห้องสมุดที่ดี แต่พวกเขาบอกคุณว่าพวกเขาจะทำอะไรทำ แต่พวกเขาไม่ได้อธิบายว่าทำไมทั้งหมดและไม่ชัดเจนเลยและมี ตัวอักษรฐานสิบหกมายากลเล็กน้อย คุณเพิ่งจะผ่านการเคลื่อนไหว นั่นไม่ใช่ปัญหาที่ใหญ่ที่สุดสำหรับฉัน แต่ปัญหาที่ใหญ่ที่สุดคือหนังสือขึ้นอยู่กับตัวอย่างที่ยากและยาวมาก (นานพอที่จะรับมากกว่าทั้งบท) คุณแทบจะไม่สามารถอ่านส่วนที่คุณต้องการ ผมคิดว่าผู้เขียนที่ดีมีความรู้ที่น่าตื่นตาตื่นใจ แต่มากเรียกยากจน
MasterMastic


69

หากต้องการเพิ่มคำตอบของคนอื่น - มีหนึ่งประโยชน์ที่จะช่วยให้คุณเมื่อการเข้ารหัส (ตัวอย่างเช่นเมื่อการแก้ปัญหาโครงการออยเลอร์): Hoogle คุณสามารถใช้อินเตอร์เฟซบรรทัดคำสั่งหรือเว็บอินเตอร์เฟส

บรรทัดคำสั่ง

หลังจากที่คุณติดตั้งแพลตฟอร์ม Haskell แล้ว cabal install hoogle

ตัวอย่างการใช้ Hoogle:

คุณมีฟังก์ชั่นf x = 3 * x + 1และคุณต้องการนำไปใช้กับมัน(5 :: Int)จากนั้นนำไปใช้กับผลลัพธ์และกับผลลัพธ์นั้นและอื่น ๆ และรับรายการที่ไม่มีที่สิ้นสุดของค่าเหล่านั้น คุณสงสัยว่าอาจมีฟังก์ชั่นให้ความช่วยเหลือคุณอยู่แล้ว (ไม่ใช่สำหรับคุณโดยเฉพาะf )

ฟังก์ชั่นนั้นจะเป็นประเภท(a -> a) -> a -> [a]ถ้ามันใช้f 5หรือa -> (a -> a) -> [a]ถ้ามันใช้5 f(เราถือว่าฟังก์ชั่นสำหรับประเภททั่วไปและไม่เพียงแค่Ints)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

iterateอ๋อฟังก์ชั่นที่คุณต้องการอยู่แล้วและก็เรียกว่า คุณใช้มันโดยiterate func 5 !

เว็บอินเตอร์เฟส

ผลเช่นเดียวกันที่สามารถพบได้ที่นี่


การค้นหาฟังก์ชั่นห้องสมุดมาตรฐานสำหรับสิ่งที่คุณต้องการจะง่ายขึ้นมากเมื่อคุณเข้าใจวิธีขอ Hoogle สำหรับสิ่งที่คุณต้องการ
ankh-morpork

57

การเขียนโปรแกรมของ Graham Hutton ใน Haskellมีความรัดกุมสมเหตุสมผลอย่างทั่วถึงและการสอนของ Haskell แสดงให้เห็นอย่างแท้จริง มันเกือบจะเป็นสิ่งที่ฉันแนะนำให้ทุกคนเริ่มต้นด้วยไม่ว่าคุณจะไปจากที่ไหน

โดยเฉพาะอย่างยิ่งบทที่ 8 ( "Parsers ฟังก์ชั่น") มีรากฐานที่แท้จริงของคุณจะต้องเริ่มจัดการกับ monads และผมคิดว่าคือไกลโดยสถานที่ที่ดีที่สุดที่จะเริ่มต้นตามด้วยทั้งหมดเกี่ยวกับ Monads (ในส่วนที่เกี่ยวกับบทนั้นให้จดบันทึก errata จากเว็บไซต์อย่างไรก็ตามคุณไม่สามารถใช้doแบบฟอร์มโดยไม่ได้รับความช่วยเหลือเป็นพิเศษคุณอาจต้องการเรียนรู้เกี่ยวกับ typeclasses ก่อนและแก้ปัญหาด้วยตัวคุณเอง)

นี่เป็นสิ่งที่ไม่ค่อยให้ความสำคัญกับผู้เริ่มต้น Haskell แต่มันก็คุ้มค่าที่จะเรียนรู้ตั้งแต่เนิ่น ๆ ไม่เพียงแค่การใช้ monads แต่เป็นการสร้างของคุณเอง มันไม่ยากและงานที่ปรับแต่งแล้วสามารถสร้างงานได้ค่อนข้างง่ายกว่า


5
นี่เป็นหนังสือที่ไม่ค่อยได้รับความสนใจ (และตอบ) บทเกี่ยวกับ parsers ที่ใช้งานได้ตามมาด้วยบทใน IO ซึ่งไม่ได้พูดถึง monads จริงๆส่องแสงเป็นวิธีการสอนที่สง่างาม
michiakig

52

อย่าพยายามอ่านบทเรียนทั้งหมดด้วยคำอุปมาอุปมัยที่ตลก พวกเขาจะทำให้คุณสับสนยิ่งขึ้น


5
ตกลงกัน! ดู 'Abstraction, สัญชาตญาณและ "ความผิดพลาดในการสอน monad" ": byorgey.wordpress.com/2009/01/12/…
ShreevatsaR

31

ฉันขอแนะนำให้เข้าร่วม#haskell irc channelและถามคำถามที่นั่น นั่นคือวิธีที่ฉันเรียนรู้ Haskell หากคุณผ่าน Real World Haskell ตามที่แนะนำข้างต้นการตอบคำถามของคุณแบบเรียลไทม์จะช่วยได้มาก ผู้คนที่ฉลาดจำนวนมากใน #haskell เขียน Haskell เพื่อความสนุกสนานและเพื่อผลกำไรดังนั้นคุณจะได้รับข้อมูลที่ดีมากมาย ลองมัน!


5
1 - ต้องมีความชัดเจน: Do ไม่ได้เรียนรู้มันเป็นเพียงแค่กับช่องไออาร์ซี อย่าเข้าไปข้างในและถามว่า "ฉันจะเขียนโปรแกรม Haskell ได้อย่างไรฉันจะเพิ่มหมายเลขได้อย่างไร"
ทางเลือก

นอกเหนือจาก irc freenode แล้วยังมีการพูดคุยกันอย่างมีชีวิตชีวาใน haskell ในการสนทนา Discord
trueadjustr


19

ฉันยังสามารถแนะนำYet Yet Haskell Tutorial เพิ่มเติมเป็นบทนำได้

ทรัพยากรการเรียนรู้ที่ดีอีก (อาจจะอยู่ในระดับกลาง) ซึ่งได้ช่วยให้ฉันเป็นจำนวนมากและยังไม่ได้รับการกล่าวถึงในคำตอบอื่น ๆ เท่าที่ผมสามารถมองเห็นเป็น Brent Yorgey ของTypeclassopediaซึ่งสามารถพบได้ในMonad อ่าน (ฉบับที่ 13)

มันเขียนในสไตล์ที่เข้าถึงได้ง่ายและมี (เหนือสิ่งอื่นใด) คำแนะนำเบื้องต้นต่อไปนี้:

ภูมิปัญญาของแฮ็กเกอร์ผู้เชี่ยวชาญ Haskell มีสองปุ่ม:

  1. ทำความเข้าใจกับประเภท

  2. รับสัญชาตญาณลึกสำหรับแต่ละประเภทชั้นเรียนและความสัมพันธ์กับชั้นเรียนประเภทอื่น ๆ สำรองโดยความคุ้นเคยกับตัวอย่างมากมาย

Monad Readerเป็นขุมสมบัติที่สมบูรณ์แบบสำหรับโปรแกรมเมอร์ที่ใช้งานได้ (ไม่ใช่เฉพาะโปรแกรมเมอร์ Haskell)


14

ลองเขียนโปรแกรมง่าย ๆ ลงไป

คุณสามารถหางานตัวอย่างในตำราต่างๆได้

ฉันจะไม่แนะนำให้ติดกับตำราเรียน Haskell / FP เพียงลองทำสิ่งง่าย ๆ กับมัน: การคำนวณการจัดการสตริงการเข้าถึงไฟล์

หลังจากที่ฉันแก้ไขโหลฉันได้ทำลายน้ำแข็ง :)

หลังจากนั้นอ่านแนวคิดขั้นสูงมากมาย (Monads, Arrows, IO, โครงสร้างข้อมูลแบบเรียกซ้ำ) เนื่องจาก Haskell นั้นไม่มีที่สิ้นสุดและมีจำนวนมาก


14

ฉันคิดว่าการตระหนักถึงคุณสมบัติของ Haskell ด้วยตัวอย่างเป็นวิธีที่ดีที่สุดในการเริ่มต้นเหนือสิ่งอื่นใด

http://en.wikipedia.org/wiki/Haskell_98_features

นี่คือประเภทของเล่ห์เหลี่ยมรวมทั้ง monads และลูกศร

http://www.haskell.org/haskellwiki/Typeclassopedia

สำหรับปัญหาในโลกแห่งความเป็นจริงและโครงการที่ใหญ่กว่าโปรดจำแท็กเหล่านี้: GHC (คอมไพเลอร์ที่ใช้มากที่สุด), Hackage (libraryDB), Cabal (ระบบอาคาร), Darcs (ระบบอาคารอื่น)

ระบบรวมสามารถประหยัดเวลาของคุณ: http://hackage.haskell.org/platform/

ฐานข้อมูลแพ็กเกจสำหรับระบบนี้: http://hackage.haskell.org/

วิกิของคอมไพเลอร์ GHC: http://www.haskell.org/haskellwiki/GHC

หลังจาก Haskell_98_features และ Typeclassopedia ฉันคิดว่าคุณสามารถค้นหาและอ่านเอกสารเกี่ยวกับพวกเขาได้แล้ว

อย่างไรก็ตามคุณอาจต้องการทดสอบส่วนขยายภาษาของ GHC ซึ่งอาจเป็นส่วนหนึ่งของมาตรฐานฮาเซลในอนาคต

นี่คือวิธีที่ดีที่สุดของฉันสำหรับการเรียนรู้ฮาเซล ฉันหวังว่ามันจะช่วยคุณได้


13

ผมขอแนะนำให้คุณเริ่มต้นโดยการอ่านการกวดวิชาโบนัส' , และจากนั้นอ่านโลกแห่งความจริง Haskell (ออนไลน์ฟรี) เข้าร่วม#Haskell IRC channel บน irc.freenode.comและถามคำถาม คนเหล่านี้เป็นมือใหม่อย่างเป็นมิตรและได้ช่วยฉันมากในช่วงเวลา นอกจากนี้ที่นี่บน SO เป็นสถานที่ที่ดีในการรับความช่วยเหลือกับสิ่งที่คุณไม่สามารถเข้าใจได้! พยายามอย่าท้อแท้เมื่อคลิกแล้วจิตใจของคุณจะปลิวไป

โบนัสบทช่วยสอนจะทำให้คุณตื่นเต้นและเตรียมพร้อมสำหรับการขี่สุดระทึกที่ Real World Haskell นำมา ฉันขอให้คุณโชคดี!


12

หากคุณมีประสบการณ์เกี่ยวกับภาษาที่มีความจำเป็น / OO เท่านั้นฉันขอแนะนำให้ใช้ภาษาที่ใช้งานทั่วไปเป็นหลัก Haskell นั้นแตกต่างกันมากและคุณต้องเข้าใจแนวคิดที่แตกต่างกันมากมายเพื่อให้ไปได้ทุกที่ ฉันแนะนำให้จัดการกับภาษาแบบ ML (เช่นเช่น F #) ก่อน


Elm อาจจะใกล้เคียงที่สุดมีประโยชน์มากขึ้นและเป็นมิตรกับผู้เริ่มต้นของตัวเลือกเหล่านี้ ...
Pedro Rolo

1
ฉันไม่เห็นด้วยกับการผ่านเส้นทางชั่วคราวเช่น F # สำหรับฉันมันเหมือนกับการดื่มวอดก้าคุณต้องจิบมันอย่างรวดเร็ว เจ็บปวดมากกว่านั้น แต่ความสุขก็อยู่ที่นั่นเช่นกัน เส้นทางชั่วคราวทำให้ฉันสับสนมากขึ้นเท่านั้น
trueadjustr

10

คำตอบแรกคือคำตอบที่ดีมาก เพื่อให้ได้ระดับผู้เชี่ยวชาญคุณควรทำปริญญาเอกกับผู้เชี่ยวชาญบางคนด้วยตัวเอง

ผมขอแนะนำให้ท่านไปที่หน้า Haskell: http://haskell.org ที่นั่นคุณมีเนื้อหามากมายและมีการอ้างอิงถึงสิ่งล่าสุดใน Haskell ที่ได้รับอนุมัติจากชุมชน Haskell


2
ขออภัยที่ใช้อาร์กิวเมนต์ระดับปริญญาเอกที่นี่ก็เหมือนกับว่าคุณต้องมีมีดทำครัว 300 $ เพื่อเป็นพ่อครัวที่ดี แม้แต่ไซม่อนเพย์ตันโจนส์ซึ่งเป็นบิดาของแฮสเค็ลล์ก็ไม่มีปริญญาเอก การฝึกฝนและการคงอยู่เป็นสิ่งที่นำไปสู่ความเชี่ยวชาญทั้งที่นี่และในสาขาอื่น ๆ
Petras Purlys
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.