Haskell AND Lisp vs. Haskell หรือ Lisp [ปิด]


40

ปัจจุบันฉันใช้รหัสกับ C, C ++ และ Python ฉันต้องการรับภาษาโปรแกรมที่ใช้งานได้และตอนนี้ฉันกำลังโน้มตัวไปหา Haskell ฉันไม่ต้องการเริ่มสงคราม "Haskell vs Lisp" ที่นี่; สิ่งที่ฉันต้องการรู้คือ: ถ้าฉันเรียนรู้ Haskell เป็นหลักสำหรับการเปิดรับฟังก์ชั่นการเขียนโปรแกรมฉันจะได้ประโยชน์อะไรจากการเรียนรู้ Lisp ในภายหลัง


1
และ F # และ Clojure
cnd

คำตอบ:


58

ฉันแนะนำให้เรียนทั้ง Haskell ก่อนจากนั้น Common Lisp ประสบการณ์ของฉันกับ Haskell คือการพิมพ์แบบสแตติกดูเหมือนจะเป็นการ จำกัด การรบกวนในตอนแรก แต่เมื่อฉันคุ้นเคยกับมันแล้วฉันสังเกตว่าข้อผิดพลาดประเภทส่วนใหญ่มีข้อผิดพลาดทางตรรกะซ่อนอยู่หลังพวกเขา เมื่อคุณมาถึงจุดนี้และเหตุการณ์สำคัญต่อไปซึ่งกำลังเรียนรู้ที่จะคิดในรูปแบบและกำหนดประเภทของคุณเองเพื่อแสดงวิธีการแก้ปัญหาของคุณคุณจะพร้อมสำหรับ Common LISP

ด้วย Common Lisp คุณสามารถเพิ่ม monads, currying และทุกสิ่งที่คุณชอบจาก Haskell แต่คุณยังได้รับมรดกหลายอย่างเช่น Frank Shearar ที่กล่าวถึงและฟังก์ชั่นทั่วไปที่มีการแจกจ่ายหลายครั้งและระบบการจัดการข้อยกเว้นขั้นสูง

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


6
ฉันคิดว่าคุณถูกจับ - สิ่งที่ทำให้ Haskell และ Smalltalk มีประโยชน์สำหรับการเรียนรู้คือความบริสุทธิ์
Frank Shearar

4
ฉันเห็นด้วยกับความบริสุทธิ์ทำให้การเรียนรู้ภาษาง่ายขึ้นมาก ฉันไม่เข้าใจภาษาที่ใช้งานได้กับ LISP เพราะทุกอย่างเป็นไปได้ในภาษาและฉันมีพื้นฐาน OO ที่จำเป็นมากเกินไป แต่ใน Haskell ไม่มีแนวคิดดังกล่าวที่รบกวนการเรียนรู้
Eonil

1
มันตลกฉันมีประสบการณ์ตรงข้าม ฉันเลือกประเด็นหลักของการเขียนโปรแกรมฟังก์ชั่นผ่าน Scheme ภาษาแรกของฉัน ฉันแฮ็กเป็นครั้งคราวในแฮสเค็ลล์และฉันพบว่าฉันต้องเรียนรู้สิ่งที่ฉันรู้ 90% + ทุกครั้งที่ออกจากแฮสเค็ลไปพักหนึ่ง ที่ถูกกล่าวว่า Haskell เป็นภาษาที่อุดมไปด้วยอย่างไม่น่าเชื่อมีจำนวนมากที่จะสอนคุณ (บังคับมาก) ประเภทประเภทประเภทประเภท! ทำตามประเภท!
Josh Infiesto

31

และได้โปรด

Haskell สอนให้เธอรู้จัก FP ที่บริสุทธิ์ที่สุดเท่าที่ฉันรู้อย่างน้อยเช่นเดียวกับ Smalltalk ที่สอน OO ให้บริสุทธิ์ที่สุด (ฉันพูดถึงสิ่งนี้ไม่แนะนำให้ OO และ FP ไม่สามารถแต่งงานได้ แต่เพราะทั้งสองภาษาเหล่านี้เป็นภาษา "อัญมณี" - เป็นแนวคิดหลักที่นำไปสู่ความสุดขั้ว)

Lisp เป็นตระกูลของภาษาจริงๆดังนั้นฉันจะพูดเกี่ยวกับ Common LISP เพราะนั่นเป็นสมาชิกในครอบครัวที่ฉันใช้

เสียงกระเพื่อมยังมีอีกมากที่จะสอนคุณ:

  • มันเป็นแบบหลายจุดดังนั้นเมื่อdsimcha ชี้ให้เห็นมันจะแสดงวิธีรวม FP กับกระบวนทัศน์อื่น ๆ
  • เสียงกระเพื่อมจะสอนคุณว่า "รหัสเป็นข้อมูลดาต้าคือรหัส" เช่นผ่านมาโครของมัน
  • CLOS เป็นแบรนด์ที่น่าสนใจมาก ๆ ของ OO พร้อมการสืบทอดหลายอย่างที่ใช้งานได้และฟังก์ชั่นทั่วไป

11

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


14
[เพิ่มความคมชัดในวงเล็บ]
Inaimathi

6
บางทีใครบางคนสามารถเขียนโปรแกรมแก้ไขข้อความสำหรับมัน ฉันได้ยินมาว่าระบบปฏิบัติการ Emacs ไม่ได้มาพร้อมกับสิ่งใดสิ่งหนึ่ง . (ฉันเด็กฉันรู้ว่าคุณจะได้รับโหมด Viper :).
greyfade

14
ที่จริงแล้วมี Emacs-clone ชื่อว่า Yi ซึ่งใช้ Haskell ในแบบเดียวกับที่ Emacs ใช้ Lisp ในความเป็นจริงเมื่อเทียบกับ (GNU) Emacs ยี่ยังบริสุทธิ์กว่าเพราะเคอร์เนลของมันถูกเขียนใน Haskell ในขณะที่เมล็ด Emacs โดยทั่วไปมักจะไม่ถูกเขียนใน Lisp เคอร์เนลของ GNU Emacs เขียนด้วยภาษา C และ JEmacs เขียนด้วยภาษาจาวา
Jörg W Mittag

2
@ ใช่, ถ้าเป็นการปรับปรุงบางส่วนแทนการโคลนเต็มรูปแบบของ GNU Emacs หรือ XEmacs, มันไม่เหมือนกัน คล้ายกับการเปรียบเทียบ Word กับ Wordpad หรือ Notepad

1
@ Thorbjørn Ravn Andersen: ใช่ แต่ไม่มากที่ไม่ดี :)
greyfade

11

Haskell และ Lisp เป็นสัตว์สองชนิดที่ต่างกันโดยสิ้นเชิง

Haskell เป็น "การเขียนโปรแกรมใช้งานได้จริงในหอคอยงาช้าง"

เสียงกระเพื่อมเป็นชนิด "code-is-data / data-is-code / สร้างโครงสร้างภาษาของคุณเอง" คุณสามารถปรับเปลี่ยนรหัสของคุณได้ตามที่คุณจินตนาการ

พวกเขาแตกต่างกันมาก ทั้งคู่แชร์แง่มุม "ฟังก์ชั่นการเขียนโปรแกรม" แต่จริงๆแล้วมันเป็นจุดร่วมเล็ก ๆ น้อย ๆ เมื่อเทียบกับความแตกต่าง ลองใช้แล้วคุณจะเห็นว่าพวกเขาแตกต่างกันอย่างไร!


+1: จุดดี ฉันรู้จัก Haskell และ Lisp บ้าง แม้ว่าฉันไม่ใช่ผู้เชี่ยวชาญในพวกเขาทั้งคู่ แต่ฉันคิดว่าคุณพูดถูกว่าแตกต่างกันมาก ใน Haskell คุณไม่มีความคิดในการใช้ข้อมูลเป็นรหัส ใน Lisp คุณไม่มีการจับคู่รูปแบบ (AFAIK) อาจเป็นรายการ (!) ของความแตกต่างอีกต่อไป
จอร์โจ

7

ประโยชน์หลักที่ฉันได้รับจากการเรียนรู้ Lisp คือการเรียนรู้วิธีผสมผสาน FP เข้ากับภาษาแบบหลายจุดในโลกแห่งความเป็นจริงแทนที่จะเรียนรู้ในบริบทของภาษาเชิงวิชาการที่เน้นความบริสุทธิ์


5
ฉันเดาว่าคุณต้องการสงคราม "Haskell vs Lisp"!
Don Roby

3
Haskell เป็นภาษาเชิงวิชาการที่เน้นความบริสุทธิ์ ... และผู้คนจำนวนมากใช้มันในโลกแห่งความจริง สมอลล์ทอล์คในค่ายนั้นด้วย
Frank Shearar

ผู้คนจำนวนมากใช้ Haskell ในโลกแห่งความเป็นจริง?
Jon Harrop

1
@ จอน Harrop: ดีฉันจะใช้ Haskell ในโลกแห่งความเป็นจริง (และมันใช้งานได้ดีสำหรับบางแอปพลิเคชัน) บางทีฉันอาจเป็นหนึ่งในไม่กี่คน (?)
Giorgio

5

ฉันยังมาจากพื้นหลัง C / C ++ / Python และได้ลอง FP สองสามครั้งในไม่กี่ปีที่ผ่านมา ตอนแรกฉันดูที่ Haskell และไม่สามารถทำส่วนหัวหรือส่วนท้ายของมันได้จากนั้นลองใช้ Ocaml แต่ไม่ได้ไปไกลกว่านั้น ในที่สุดฉันก็เริ่มได้ยินสิ่งดีๆเกี่ยวกับ Scala ลองและพบว่ามันเหมาะกับฉันเป็นอย่างมาก (ฉันเคยทำ Java มาก่อน) จนถึงจุดที่หลังจากเล่นน้ำใน Scala มา 1 ปี (และเยี่ยงอย่าง 161 ปัญหาเกี่ยวกับโครงการออยเลอร์ด้วย) Haskell ดูเหมือนจะสมเหตุสมผลมากกว่า ในความเป็นจริงฉันเพิ่งสั่งซื้อหนังสือสองเล่มเกี่ยวกับ Haskell และต้องการที่จะให้มันไปอีกแม้ว่าจะมีแรงจูงใจส่วนใหญ่จากการดำรงอยู่ของ Scalaz

ดังนั้นฉันจึงพบว่าใช้ภาษาหลายกระบวนทัศน์ (เช่น Scala แต่ Lisp อาจเหมาะกับการเรียกเก็บเงินด้วย) วิธีที่ดีใน FP แต่ถ้าคุณมีความสุขในการดำน้ำใน Haskell (ฉันไม่ใช่) ไปเลย


ที่น่าสนใจที่คุณได้เพิ่มเติมกับ Scala กว่า OCaml มาทำไม
Jon Harrop

@ จอน: คำถามที่ดี; ยากที่จะพูด. บางทีฉันก็ยังไม่พร้อมที่จะ "เข้าสู่" การทำงานในเวลานั้น บางทีฉันเพิ่งเกิดขึ้นเพื่อค้นหาการกวดวิชา Scala แหลมในระดับที่เหมาะสม บางทีเชื้อสาย C / C ++ / Java ของ Scala อาจทำให้มนุษย์ต่างดาวน้อยลง ด้วยการเดิมพันที่มีเหตุผลทุกวันนี้น่าจะอยู่ที่ F # มากกว่า Scala ฉันอาจจะกลับไปที่โดเมน OCaml ในบางครั้งถึงแม้ว่าฉันจะตะลุยในสิ่งนี้เพียงเพื่อความสุขที่แท้จริงของการเข้าสู่ "แนวคิดการเขียนโปรแกรม" ที่แตกต่างกัน dayjob ฉันมีความชอบผิดปกติที่จะลอง Haskell อีกครั้งในภายหลัง
timday

วิธีการเคลื่อนไหวที่ราบรื่น :)
Eonil

2

เดิมทีฉันมาจากพื้นหลัง C / C ++ / Ruby และฉันใช้แนวคิด FP ใน Ruby ทุกครั้งที่ทำได้ บอกเพียงแค่เจ็บสมองของฉัน หนึ่งในเพื่อนของฉันโทรหาฉันในวันหนึ่งและเขาขอให้ฉันเขียนบางสิ่งใน Haskell (ครั้งแรกของฉัน - และหวังว่าจะไม่อยู่นาน - งาน Haskell!) ฉันเรียนรู้ภาษาอย่างรวดเร็วและฉันโยนบางสิ่งที่ทำงานร่วมกัน มันไม่ได้สวยงามหรืออะไรเลย แต่มันใช้ได้

ฉันหยุดพักหนึ่งเดือนจาก Haskell เพราะฉันไม่มีอะไรจะใช้ทำ แต่เมื่อฉันตัดสินใจว่าฉันจำเป็นต้องเขียนซอฟต์แวร์บล็อกของตัวเองฉันใช้ Haskell ( https://symer.io ) Haskell นั้นเจ๋งจริงๆเพราะคุณสามารถแบ่งปัญหาออกเป็นส่วน ๆ และใช้ส่วนต่าง ๆ เหล่านี้ตามอินพุต Haskell ยังจัดการกับความล้มเหลวได้อย่างดีเยี่ยมด้วยการใช้มวยอย่างชาญฉลาดของค่านิยม มีเครื่องมือมากมายที่จะทำงานกับกล่องเหล่านี้ซึ่งคุณก็ลืมพวกเขาอยู่

ประสบการณ์ของฉันกับ lisp (Scheme) นั้นเป็นลบอย่างสมบูรณ์ ไม่เพียง แต่ภาษาจะขาดเครื่องมือที่เรียบง่ายและชาญฉลาดเหล่านี้ แต่ยังรู้สึกว่าหลวมอย่างอันตรายเหมือนทับทิมหรือ JavaScript มันเป็นประสบการณ์ที่น่ากลัวและไม่มีอะไรใหม่นอกจาก Ruby หรือ Python

C ++ ไม่สามารถถือเทียนให้ Haskell ได้นอกการจัดการหน่วยความจำ Haskell นั้นเร็วเหมือนกัน (ถ้าไม่เร็วกว่า), สั้นกว่ามากและปลอดภัยกว่า แต่ความปลอดภัยของ Haskell ไม่เคยเกิดขึ้น

TL; TR Haskell เป็นลมหายใจที่มีอากาศบริสุทธิ์และ Lisp เป็นทับทิมที่มีประโยชน์มากกว่าเล็กน้อย

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