ภาษาอะไรที่จะเรียนรู้หลังจาก Haskell? [ปิด]


85

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

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

  • ระบบชนิดที่แข็งแกร่ง ส่วนหนึ่งที่ฉันชอบที่สุดในการเขียนโปรแกรมใน Haskell คือการเขียนประกาศประเภท สิ่งนี้ช่วยจัดโครงสร้างความคิดของฉันเกี่ยวกับฟังก์ชันส่วนบุคคลและความสัมพันธ์กับโปรแกรมโดยรวม นอกจากนี้ยังทำให้การให้เหตุผลอย่างไม่เป็นทางการเกี่ยวกับความถูกต้องของโปรแกรมของฉันง่ายขึ้น ฉันกังวลกับความถูกต้องไม่ใช่ประสิทธิภาพ
  • เน้นการเรียกซ้ำมากกว่าการวนซ้ำ ฉันใช้โครงสร้างแบบวนซ้ำใน Haskell แต่ใช้แบบวนซ้ำ อย่างไรก็ตามการทำความเข้าใจโครงสร้างของฟังก์ชันวนซ้ำนั้นง่ายกว่าขั้นตอนการวนซ้ำที่ซับซ้อนโดยเฉพาะเมื่อใช้ตัวรวมและฟังก์ชันลำดับที่สูงกว่าเช่นแผนที่การพับและการผูก
  • ให้รางวัลกับการเรียนรู้ Haskell เป็นภาษาที่คุ้มค่าในการทำงานมันเหมือนกับการอ่าน Kant ประสบการณ์ของฉันเมื่อหลายปีก่อนกับ C ไม่เป็นเช่นนั้น ฉันไม่ได้มองหาภาษา C ภาษาควรบังคับใช้กระบวนทัศน์ที่น่าสนใจซึ่งในความเห็นส่วนตัวของฉัน C-likes ไม่ชอบ

การชั่งน้ำหนักคำตอบ : แน่นอนว่านี่เป็นเพียงบันทึกย่อ ฉันแค่อยากจะตอบกลับทุกคนที่ให้การตอบกลับในรูปแบบที่ดี คุณได้รับประโยชน์มาก

1) คำตอบหลาย ๆ คำตอบระบุว่าภาษาที่พิมพ์แน่นและคงที่ซึ่งเน้นการเรียกซ้ำหมายถึงภาษาที่ใช้งานได้อื่น ในขณะที่ฉันต้องการทำงานอย่างเข้มแข็งกับ Haskell ต่อไป แต่ camccann และ larsmans ก็ชี้ให้เห็นอย่างถูกต้องว่าภาษาอื่นจะ "ทำให้การเปลี่ยนแปลงง่ายขึ้นมากเกินไป" ความคิดเห็นเหล่านี้มีประโยชน์มากเพราะฉันไม่อยากเขียน Haskell ใน Caml! จากผู้ช่วยพิสูจน์ Coq และ Agda ต่างก็ดูน่าสนใจ โดยเฉพาะอย่างยิ่ง Coq จะให้คำแนะนำที่ชัดเจนเกี่ยวกับตรรกะเชิงสร้างสรรค์และทฤษฎีประเภททางการ ฉันใช้เวลาเล็กน้อยกับเพรดิเคตและลอจิกกิริยาลำดับแรก (Mendellsohn, Enderton, Hinman บางส่วน) ดังนั้นฉันอาจจะสนุกกับ Coq มาก

2) คนอื่น ๆ ชื่นชอบ Lisp (Common Lisp, Scheme และ Clojure) จากสิ่งที่ฉันรวบรวมทั้ง Common Lisp และ Scheme มีเนื้อหาแนะนำที่ยอดเยี่ยม ( On LispและThe Reasoned Schemer , SICP ) เนื้อหาในSICPทำให้ฉันเอนเอียงไปที่ Scheme โดยเฉพาะอย่างยิ่งโครงการผ่านSICPจะครอบคลุมกลยุทธ์การประเมินผลที่แตกต่างกันการดำเนินการตามความเกียจคร้านและโอกาสที่จะมุ่งเน้นไปที่หัวข้อต่างๆเช่นความต่อเนื่องล่ามการคำนวณเชิงสัญลักษณ์และอื่น ๆ ในที่สุดตามที่คนอื่น ๆ ชี้ให้เห็นการรักษารหัส / ข้อมูลของ Lisp จะเป็นเรื่องใหม่ทั้งหมด ดังนั้นฉันจึงเอนเอียงไปที่ตัวเลือก (2) เสียงกระเพื่อม

3) ประการที่สาม Prolog Prolog มีเนื้อหาที่น่าสนใจมากมายและโดเมนหลักก็คือสิ่งที่ฉันสนใจมันมีไวยากรณ์ที่เรียบง่ายและอ่านง่าย ฉันไม่สามารถแสดงความคิดเห็นเพิ่มเติมได้ในขณะนี้ แต่หลังจากอ่านภาพรวมของ Prolog และอ่านเนื้อหาเบื้องต้นบางส่วนแล้วจะมีอันดับ (2) และดูเหมือนว่าการย้อนรอยของ Prolog จะถูกแฮ็กเข้าสู่ Haskell อยู่เสมอ!

4) ในภาษาหลัก Python ดูน่าสนใจที่สุด Tim Yates ทำให้ภาษาฟังดูน่าสนใจมาก เห็นได้ชัดว่า Python มักจะสอนวิชาเอก CS ปีแรก ดังนั้นจึงมีแนวคิดที่สมบูรณ์หรือง่ายต่อการเรียนรู้ ฉันต้องค้นคว้าเพิ่มเติม

ขอบคุณทุกคนสำหรับคำแนะนำ! ดูเหมือนว่า Lisp (Scheme, Clojure), Prolog หรือผู้ช่วยพิสูจน์เช่น Coq หรือ Agda จะเป็นภาษาหลักที่แนะนำ


34
2.5 เดือนมีเวลาไม่เพียงพอที่จะเรียนรู้ภาษาในเชิงลึกขออภัยที่ทำให้ฟองสบู่แตก
Woot4Moo

20
นั่นเป็นความจริงอย่างแน่นอน ฉันไม่ได้ตั้งใจจะบอกเป็นนัยว่าฉัน "เรียนรู้" Haskell ไม่ว่าจะหมายถึงอะไร ฉันหมายความว่าฉันรู้สึกสบายใจในการใช้ภาษา ฉันจะไม่ "หยุดเรียนรู้" อย่างชัดเจน
danportin

10
@ Michael: การเข้ารหัสเพื่อความถูกต้องแทนที่จะเป็นประสิทธิภาพเป็นสิ่งที่ฉันอยากเห็นมากขึ้น ...
Deniz Dogan

24
@ Woot4Moo: 2.5 เดือนมีเวลาเหลือเฟือที่จะ "สบายใจ" กับภาษา เป็นทวีคูณถ้าเขาคุ้นเคยกับตรรกะที่เป็นทางการและทำงานกับแนวคิดนามธรรมจากภูมิหลังปรัชญาของเขา การไม่ต้องเรียนรู้นิสัยจากภาษาอื่นก็จะช่วยได้เช่นกันในกรณีนี้
CA McCann

8
@gnovice: มีคนถามหลายครั้งแน่นอน แต่นี่เป็นครั้งแรกที่ฉันเจอคนที่มีประสบการณ์การเขียนโปรแกรมจริงจังครั้งแรกกับ Haskell มันเหมือนกับว่าลูกศรแห่งกาลเวลาถูกพลิกกลับหรืออะไรสักอย่าง
Muhammad Alkarouri

คำตอบ:


85

ฉันต้องการเพิ่มพูนความรู้ด้านการเขียนโปรแกรม (... ) ฉันคิดว่าฉันจะตั้งคำถามที่นี่พร้อมกับข้อกำหนดหลายประการเกี่ยวกับประเภทของภาษาที่ฉันกำลังมองหา บางคนเป็นเรื่องส่วนตัวบางคนมีจุดมุ่งหมายเพื่อลดการเปลี่ยนจาก Haskell

ระบบชนิดที่แข็งแกร่ง (... ) นอกจากนี้ยังทำให้การให้เหตุผลอย่างไม่เป็นทางการเกี่ยวกับความถูกต้องของโปรแกรมของฉันง่ายขึ้น ฉันกังวลกับความถูกต้องไม่ใช่ประสิทธิภาพ

เน้นการเรียกซ้ำมากกว่าการวนซ้ำ (... )

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

  • ไม่คำนึงถึงการปฏิบัติจริงและใช้ "Haskell มากกว่า Haskell" : ระบบประเภทของ Haskell เต็มไปด้วยช่องโหว่เนื่องจากการไม่เปลี่ยนแปลงและการประนีประนอมที่ยุ่งเหยิงอื่น ๆ ล้างระเบียบและเพิ่มคุณสมบัติที่มีประสิทธิภาพมากขึ้นและคุณจะได้ภาษาเช่นCoqและAgdaซึ่งประเภทของฟังก์ชันจะมีหลักฐานยืนยันความถูกต้อง (คุณสามารถอ่านลูกศรของฟังก์ชัน->เป็นความหมายเชิงตรรกะได้ด้วย!) ภาษาเหล่านี้ถูกใช้เพื่อการพิสูจน์ทางคณิตศาสตร์และสำหรับโปรแกรมที่ต้องการความถูกต้องสูงมาก Coq น่าจะเป็นภาษาที่โดดเด่นที่สุดในสไตล์นี้ แต่ Agda มีความรู้สึก Haskell-y มากกว่า (เช่นเดียวกับที่เขียนด้วยภาษา Haskell เอง)

  • ไม่สนใจประเภทเพิ่มเวทย์มนตร์ให้มากขึ้น : ถ้า Haskell เป็นเวทมนตร์Lispคือเวทมนตร์แห่งการสร้างแบบดั้งเดิม ภาษาตระกูล Lisp (รวมถึงSchemeและClojure ) มีความยืดหยุ่นที่แทบไม่มีใครเทียบได้รวมกับความเรียบง่ายแบบสุดขั้ว ภาษาไม่มีไวยากรณ์โดยพื้นฐานแล้วการเขียนโค้ดโดยตรงในรูปแบบโครงสร้างข้อมูลแบบต้นไม้ การเขียนโปรแกรมเมตาด้วยเสียงกระเพื่อมนั้นง่ายกว่าการเขียนโปรแกรมที่ไม่ใช่เมตาในบางภาษา

  • ประนีประนอมเล็กน้อยและเข้าใกล้กระแสหลัก : Haskell ตกอยู่ในกลุ่มภาษากว้าง ๆ ที่ได้รับอิทธิพลอย่างมากจาก ML ซึ่งคุณสามารถเปลี่ยนไปใช้โดยไม่ยากเกินไป Haskell เป็นหนึ่งในผู้ที่เข้มงวดที่สุดในการรับประกันความถูกต้องจากประเภทและการใช้รูปแบบการทำงานโดยที่รูปแบบอื่น ๆ มักจะเป็นสไตล์ไฮบริดและ / หรือประนีประนอมในเชิงปฏิบัติด้วยเหตุผลหลายประการ หากคุณต้องการสัมผัสกับ OOP และเข้าถึงแพลตฟอร์มเทคโนโลยีหลักจำนวนมากไม่ว่าจะเป็นScalaบน JVM หรือF #บน. NET มีหลายสิ่งที่เหมือนกันกับ Haskell ในขณะที่ให้การทำงานร่วมกันได้ง่ายกับแพลตฟอร์ม Java และ. NET F # ได้รับการสนับสนุนโดยตรงจาก Microsoft แต่มีข้อ จำกัด ที่น่ารำคาญเมื่อเทียบกับ Haskell และปัญหาการพกพาบนแพลตฟอร์มที่ไม่ใช่ Windows Scala มีส่วนร่วมโดยตรงกับระบบประเภทของ Haskell และศักยภาพในการข้ามแพลตฟอร์มของ Java แต่มีไวยากรณ์ที่มีน้ำหนักมากขึ้นและขาดการสนับสนุนจากบุคคลที่หนึ่งที่มีประสิทธิภาพซึ่ง F # ชอบ

คำแนะนำเหล่านั้นส่วนใหญ่ยังกล่าวถึงในคำตอบอื่น ๆ ด้วย แต่หวังว่าเหตุผลของฉันสำหรับพวกเขาจะช่วยให้รู้แจ้งได้


4
ฉันเป็นครอบครัวของCoqและAgdaคุณสามารถดูQi IIได้
Hynek -Pichi- Vychodil

อะไรคือข้อ จำกัด ที่น่ารำคาญของ F # ในความคิดของคุณ? ในฐานะที่มีคนเรียนรู้ F # ในเวลาว่างฉันก็อยากรู้
Lucas

7
@ ลูคัส: Haskell ตัวใหญ่เทียบกับกระดูกเปลือยไม่มีความหลากหลายและคลาสประเภทที่สูงกว่า นอกเหนือจากนั้นส่วนขยายเฉพาะ GHC บางส่วนก็ค่อนข้างดี ไม่มีข้อบกพร่องร้ายแรงไม่ว่าด้วยวิธีการใด ๆ แต่หลังจากคุ้นเคยกับ Haskell แล้วก็รู้สึกเงอะงะที่ไม่มีสิ่งนั้น ลองนึกภาพการเปลี่ยนจาก C # สมัยใหม่กลับไปใช้ C # 1.x ...
CA McCann

@HyneK: ภาษา Qi 2 นี้ในตอนแรกดูเหมือนว่าน่าสนใจและยืดหยุ่นกว่า Coq หรือ Adga ดูเหมือนว่าผู้เขียนได้ตัดสินใจที่จะเรียกมันว่าเลิก มีความเคลื่อนไหวในการทำงานกับภาษานี้ต่อไปหรือไม่? ฉันไม่ต้องการเรียนรู้สิ่งที่ตายไปแล้วครึ่งหนึ่ง
Alex

@ อเล็กซ์: ดูเหมือนว่าจะดำเนินต่อไปในฐานะ Shen: shenlanguage.org
amindfv

20

ฉันจะเป็นผู้ชายคนนั้นและขอแนะนำว่าคุณกำลังขอสิ่งผิด

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

ฉันขอแนะนำให้คุณเรียนรู้ Lisp เช่น Common Lisp, Scheme / Racket หรือ Clojure ทั้งหมดนี้พิมพ์แบบไดนามิกโดยค่าเริ่มต้น แต่มีการบอกใบ้ประเภทบางประเภทหรือการพิมพ์แบบคงที่ แร็กเก็ตและ Clojure น่าจะเป็นทางออกที่ดีที่สุดของคุณ

Clojureเป็นเวอร์ชันล่าสุดและมี Haskellisms มากขึ้นเช่นการไม่เปลี่ยนรูปโดยค่าเริ่มต้นและการประเมินที่ขี้เกียจมากมาย แต่มันขึ้นอยู่กับ Java Virtual Machine ซึ่งหมายความว่ามันมีหูดแปลก ๆ (เช่น JVM ไม่รองรับการกำจัดการโทรหางดังนั้นการเรียกซ้ำจึงเป็นเรื่องที่ดี ของการแฮ็ก)

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

ระบบมาโครใน Lisps มีความน่าสนใจและทรงพลังยิ่งกว่าสิ่งอื่นใดที่คุณจะเห็น เพียงอย่างเดียวก็คุ้มค่าอย่างน้อยเมื่อมอง


3
จากมุมมองของ Haskell การพิมพ์คำใบ้หรือตัวเลือกการพิมพ์แบบคงที่ไม่ได้ดูแตกต่างจากการพิมพ์แบบไดนามิกโดยสิ้นเชิง มันเป็นความคิดที่แตกต่างกันมาก ที่กล่าวว่าภาษา Lisp-y เป็นเรื่องสนุกและเป็นสิ่งที่ฉันคิดว่าโปรแกรมเมอร์ทุกคนควรใช้เวลาเรียนรู้อย่างน้อย
CA McCann

19

จากมุมมองของสิ่งที่เหมาะกับวิชาเอกของคุณตัวเลือกที่ชัดเจนดูเหมือนจะเป็นภาษาตรรกะเช่น Prolog หรืออนุพันธ์ การเขียนโปรแกรมลอจิกสามารถทำได้อย่างประณีตในภาษาที่ใช้งานได้ (ดูเช่นThe Reasoned Schemer ) แต่คุณอาจสนุกกับการทำงานกับกระบวนทัศน์ตรรกะโดยตรง

ระบบพิสูจน์ทฤษฎีบทแบบโต้ตอบเช่น twelf หรือ coq อาจทำให้คุณประหลาดใจได้เช่นกัน


2
ในขณะที่คุณระบุความสนใจในภาษาที่พิมพ์อย่างรุนแรงฉันขอแนะนำ lambdaProlog ซึ่งเป็นภาษาการเขียนโปรแกรมลอจิกลำดับที่สูงกว่า การใช้งานที่รวบรวมได้หนึ่งรายการคือ Teyjus - code.google.com/p/teyjus (การเปิดเผย: ฉันทำงานกับ Teyjus)
Zach Snow

18

ฉันขอแนะนำให้คุณเรียนรู้Coqซึ่งเป็นผู้ช่วยพิสูจน์หลักฐานที่มีประสิทธิภาพพร้อมไวยากรณ์ที่จะทำให้โปรแกรมเมอร์ของ Haskell รู้สึกสบายใจ สิ่งที่ยอดเยี่ยมเกี่ยวกับ Coq คือสามารถแยกเป็นภาษาที่ใช้งานได้อื่น ๆ รวมถึง Haskell มีแม้แต่แพ็คเกจ ( Meldable-Heap ) บน Hackage ที่เขียนด้วย Coq ซึ่งมีคุณสมบัติที่พิสูจน์แล้วเกี่ยวกับการทำงานของมันจากนั้นแยกไปยัง Haskell

ภาษายอดนิยมอีกภาษาหนึ่งที่ให้พลังมากกว่า Haskell คือAgda - ฉันไม่รู้ว่า Agda เกินกว่าที่จะรู้ว่ามันถูกพิมพ์บน Hackage และเป็นที่เคารพนับถือของคนที่ฉันเคารพ แต่นั่นก็เป็นเหตุผลที่ดีพอสำหรับฉัน

ฉันไม่คิดว่าสิ่งเหล่านี้จะง่าย แต่ถ้าคุณรู้จัก Haskell และต้องการก้าวไปสู่ภาษาที่ให้พลังมากกว่าระบบประเภท Haskell ก็ควรได้รับการพิจารณา


1
Agda ฟังดูเหมือน "ก้าวต่อไป" จาก Haskell
Deniz Dogan

5
นอกจากนี้ยังเป็นที่น่าสังเกตว่าหากในฐานะนักปรัชญาเขามีประสบการณ์มากมายกับตรรกะที่เป็นทางการผู้ช่วยพิสูจน์สไตล์ Curry-Howard อาจทำให้เขางงงวยน้อยกว่าที่พวกเขาจะเป็นโปรแกรมเมอร์ที่มีประสบการณ์
CA McCann

11

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

  • เสียงกระเพื่อมภาษาสำหรับข้อมูลรหัส as-/ สิ่ง homoiconicity และเนื่องจากพวกเขาเป็นสิ่งที่ดีถ้าไม่ดีที่สุดตัวอย่างของแบบไดนามิก (มากหรือน้อยอย่างเข้มงวด) โปรแกรมปฏิบัติการภาษา
  • Prologเป็นภาษาการเขียนโปรแกรมลอจิกที่โดดเด่น
  • Smalltalkเป็นภาษา OOP ที่แท้จริง (น่าสนใจเช่นกันเพราะโดยทั่วไปแล้ววิธีการที่เน้นภาพเป็นศูนย์กลาง)
  • อาจจะเป็นErlangหรือClojureหากคุณสนใจภาษาที่ปลอมแปลงสำหรับการเขียนโปรแกรมพร้อมกัน / ขนาน / กระจาย
  • ไว้สำหรับการเขียนโปรแกรมเชิงสแต็ค
  • ( Haskellสำหรับการเขียนโปรแกรมขี้เกียจพิมพ์แบบคงที่ทำงานอย่างเข้มงวด)

โดยเฉพาะอย่างยิ่ง Lisps (CL ไม่มากเท่า Scheme) และ Prolog (และ Haskell) ยอมรับการเรียกซ้ำ

แม้ว่าฉันจะไม่ใช่กูรูในภาษาเหล่านี้ แต่ฉันก็ใช้เวลากับแต่ละภาษายกเว้น Erlang และ Forth พวกเขาทั้งหมดให้ประสบการณ์การเรียนรู้ที่น่าสนใจและเปิดหูเปิดตาแก่ฉันเนื่องจากแต่ละคนใช้วิธีแก้ปัญหาจากมุมที่ต่างกัน .

ดังนั้นแม้ว่าฉันจะเพิกเฉยต่อส่วนที่คุณไม่มีเวลาลองภาษาสักสองสามภาษา แต่ฉันคิดว่าเวลาที่ใช้ไปกับสิ่งเหล่านี้จะไม่สูญเปล่าและคุณควรดูทั้งหมด


ฉันไม่สามารถทนต่อข้อ จำกัด ของ Erlang ที่เกี่ยวข้องกับผู้พิทักษ์ได้;)
gorsky

10

ภาษาการเขียนโปรแกรมเชิงสแต็กเป็นอย่างไร? แมวตีคะแนนสูงสุดของคุณ มันคือ:

  • พิมพ์แบบคงที่ด้วยการอนุมานประเภท
  • ทำให้คุณคิดใหม่เกี่ยวกับแนวคิดภาษาที่จำเป็นทั่วไปเช่นการวนซ้ำ การดำเนินการตามเงื่อนไขและวนลูปได้รับการจัดการกับcombinators
  • การให้รางวัล - บังคับให้คุณเข้าใจรูปแบบการคำนวณอีกแบบหนึ่ง ช่วยให้คุณคิดและย่อยสลายปัญหาได้อีกทางหนึ่ง

ด็อบบ์สตีพิมพ์บทความสั้น ๆเกี่ยวกับ Cat ในปี 2008 แม้ว่าภาษาจะเปลี่ยนไปเล็กน้อย


10

หากคุณต้องการ Prolog ที่แข็งแรง (er) ly ที่พิมพ์ออกมาปรอทเป็นตัวเลือกที่น่าสนใจ ในอดีตฉันเคยขลุกอยู่กับมันและฉันชอบมุมมองที่แตกต่างออกไป นอกจากนี้ยังมี moded-ness (พารามิเตอร์ใดที่ต้องเป็นอิสระ / คงที่) และดีเทอร์มินิซึม (มีผลลัพธ์กี่แบบ) ในระบบประเภท

Cleanคล้ายกับ Haskell มาก แต่มีการพิมพ์ที่ไม่เหมือนใครซึ่งใช้เป็นทางเลือกสำหรับ Monads (โดยเฉพาะ IO monad) การพิมพ์ที่เป็นเอกลักษณ์ยังทำสิ่งที่น่าสนใจในการทำงานกับอาร์เรย์


9

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


8

แม้ว่าจะไม่ตรงตามเกณฑ์ใหญ่ข้อหนึ่งของคุณ (การพิมพ์แบบคงที่ *) ฉันจะสร้างกรณีสำหรับ Python นี่คือเหตุผลบางประการที่ฉันคิดว่าคุณควรดู:

  • สำหรับภาษาที่จำเป็นมันใช้งานได้อย่างน่าประหลาดใจ นี่เป็นหนึ่งในสิ่งที่ทำให้ฉันประทับใจเมื่อได้เรียนรู้ ใช้ความเข้าใจในรายการเช่น มี lambdas ฟังก์ชั่นชั้นหนึ่งและองค์ประกอบที่ได้รับแรงบันดาลใจจากการทำงานมากมายบนตัววนซ้ำ (แผนที่พับซิป ... ) ช่วยให้คุณมีตัวเลือกในการเลือกกระบวนทัศน์ที่เหมาะสมกับปัญหามากที่สุด
  • IMHO ก็เหมือนกับ Haskell ที่สวยงามในการเขียนโค้ดไวยากรณ์นั้นเรียบง่ายและสง่างาม
  • มีวัฒนธรรมที่เน้นการทำสิ่งต่างๆอย่างตรงไปตรงมาแทนที่จะมุ่งเน้นไปที่ประสิทธิภาพมากเกินไป

ฉันเข้าใจว่าถ้าคุณกำลังมองหาอย่างอื่น ตัวอย่างเช่นการเขียนโปรแกรมลอจิกอาจเหมาะกับคุณอย่างที่คนอื่นแนะนำ


* ฉันคิดว่าคุณหมายถึงการพิมพ์แบบคงที่ที่นี่เนื่องจากคุณต้องการประกาศประเภท ในทางเทคนิค Python เป็นภาษาที่พิมพ์อย่างรุนแรงเนื่องจากคุณไม่สามารถตีความโดยพลการพูดสตริงเป็นตัวเลขได้ ที่น่าสนใจมีอนุพันธ์งูหลามที่ช่วยให้การพิมพ์แบบคงที่เช่นBoo


ระบบประเภทที่แข็งแกร่งไม่จำเป็นต้องหมายถึงการพิมพ์แบบ "คงที่" เท่านั้น
Deniz Dogan

+1 ยังเห็นความคิดเห็นของฉันเกี่ยวกับคำตอบของ larsmans แต่ระวังโฆษณา Python ว่าใช้งานได้ดี ยกตัวอย่างเช่นการแสดงออกกำเนิดมักจะต้องการมากกว่าmap, filterฯลฯ แต่ยังคงกำเนิดและการแสดงออกกำเนิดจะรู้สึกคุ้นเคยกับคนที่รู้การประเมินผลขี้เกียจและกล่าวว่าฟังก์ชั่น

16
จริงๆ? ฉันคิดว่า Python ส่วนใหญ่ดูเหมือนจะใช้งานได้ดีสำหรับผู้ที่ยังไม่ได้เขียนโปรแกรมที่ใช้งานได้ดีนัก ฉันใช้ทั้ง Python และ Haskell มาพอสมควรและแม้ว่า Python เป็นภาษาที่ดีและแน่นอนว่าได้ยืมบางสิ่งมาจากภาษาที่ใช้งานได้ แต่ก็ยังมีความจำเป็น 99%
CA McCann

@camccann คุณพูดถูก - มุมมองของฉันแตกต่างออกไปฉันแค่เสนอสิ่งนี้เป็นทางเลือกที่น่าสนใจ ในฐานะคนที่เรียนรู้การเขียนโปรแกรมที่จำเป็นมาก่อนฉันขอขอบคุณที่ Python ช่วยให้ฉันใช้เทคนิคการใช้งานได้ตามความเหมาะสมและหลีกเลี่ยงในที่ที่มีเหตุผลอื่น ฉันไม่ได้ทำกรณีที่มัน "ใช้งานได้" - เพียงแต่ว่ามันทำให้เกิดการประนีประนอมได้ดี
Tim Yates

นิสัยที่เรียนรู้จาก Haskell สามารถทำให้คุณเป็นโปรแกรมเมอร์ Python ได้ดีกว่าคนอื่น ๆ ที่เรียนเป็นภาษาแรก
u0b34a0f6ae

8

ฉันอยากจะแนะนำคุณ Erlang ไม่ใช่ภาษาที่พิมพ์ยากและคุณควรลองใช้ เป็นวิธีการเขียนโปรแกรมที่แตกต่างกันมากและคุณอาจพบว่ามีปัญหาในกรณีที่การพิมพ์หนักแน่นไม่ใช่ The Best Tool (TM) อย่างไรก็ตาม Erlang มีเครื่องมือสำหรับการตรวจสอบประเภทคงที่ (typer, dialyzer) และคุณสามารถใช้การพิมพ์ที่แข็งแกร่งในส่วนที่คุณได้รับประโยชน์จากมัน อาจเป็นประสบการณ์ที่น่าสนใจสำหรับคุณ แต่เตรียมตัวให้พร้อมมันจะเป็นความรู้สึกที่แตกต่างกันมาก หากคุณกำลังมองหา "กระบวนทัศน์ที่น่าสนใจเชิงแนวคิด" คุณสามารถพบได้ใน Erlang การส่งข้อความการแยกหน่วยความจำแทนที่จะแบ่งปันการแจกจ่าย OTP การจัดการข้อผิดพลาดและการเผยแพร่ข้อผิดพลาดแทนที่จะเป็น "การป้องกัน" ข้อผิดพลาดเป็นต้น Erlang อาจอยู่ห่างไกลจากประสบการณ์ปัจจุบันของคุณ แต่ยังคงรู้สึกกระปรี้กระเปร่าหากคุณมีประสบการณ์กับ C และ Haskell


8

ป.ร. ให้คำอธิบายของคุณผมจะแนะนำOcamlหรือF #

โดยทั่วไปแล้วตระกูล ML นั้นดีมากในแง่ของระบบที่แข็งแกร่ง การให้ความสำคัญกับการเรียกซ้ำควบคู่ไปกับการจับคู่รูปแบบก็ชัดเจนเช่นกัน

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

หากคุณไม่ได้กำหนดข้อ จำกัด ของคุณฉันจะแนะนำPythonหรือErlangซึ่งทั้งสองอย่างนี้จะพาคุณออกจากเขตความสะดวกสบายของคุณ


6

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

ตามที่ผู้โพสต์อื่น ๆ แนะนำ Prolog และ Lisp / Scheme นั้นดีแม้ว่าทั้งคู่จะพิมพ์แบบไดนามิก หนังสือดีๆมากมายที่มี "รสนิยม" ทางทฤษฎีที่ชัดเจนสำหรับพวกเขาได้รับการตีพิมพ์เกี่ยวกับ Scheme ลองดูSICPซึ่งสื่อถึงภูมิปัญญาทางวิทยาศาสตร์คอมพิวเตอร์ทั่วไปจำนวนมาก (ล่ามเมตา - วงกลมและอื่น ๆ )


4
+1 สำหรับย่อหน้าแรกคือสิ่งที่ฉันคิดเมื่ออ่านคำถาม เพื่อประโยชน์ในการเรียนรู้สิ่งใหม่ ๆ ฉันขอแนะนำภาษาที่จำเป็นสมัยใหม่เช่น Python โดยเฉพาะอย่างยิ่งเนื่องจากไม่ใช่สิ่งที่ OP เคยใช้ (การพิมพ์แบบไดนามิกตัวทำซ้ำทุกที่ ฯลฯ ) นอกจากนี้ยังมีแนวคิดขั้นสูงที่ยอดเยี่ยมมากเช่น metaclasses หรือ generators (ซึ่งคล้ายกับ lazy list อย่างมาก) / การแสดงออกของเครื่องกำเนิดไฟฟ้า นอกจากนี้ให้เขียนตามคำบอกและตั้งกฎความเข้าใจ

3
@delnan: Haskell มีความเข้าใจในรายการเช่นกันและเครื่องกำเนิดไฟฟ้า / ตัววนซ้ำสามารถแสดงใน Haskell โดยใช้ประเภทรายการมาตรฐานของ Haskell ดังนั้นความแตกต่างที่ใหญ่ที่สุดระหว่างสองภาษาในความคิดของฉันคือการเขียนโปรแกรมเชิงวัตถุและ (ส่วนใหญ่) โครงสร้างข้อมูลที่ไม่บริสุทธิ์เช่นพจนานุกรม
Deniz Dogan

1
@ เดนิซโดแกน: อย่าลืมขาดการประกาศและการกำหนดขอบเขตคำศัพท์ที่เหมาะสมใน Python
Fred Foo


5

คุณสามารถเริ่มต้นมองเข้าไปในเสียงกระเพื่อม

Prolog เป็นภาษาที่ยอดเยี่ยมเช่นกัน


5

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

จริงอยู่มันไม่เหมาะกับความคิดของคุณว่าคุณต้องการอะไร แต่ลองดูสิ แค่รู้ว่ามันมีค่าควรแก่การค้นพบ แหล่งเดียวของการใช้งานที่สมบูรณ์คือ J Software, jsoftware.com


0

ไปกับหนึ่งในสตรีมหลัก ได้รับทรัพยากรที่มีศักยภาพด้านการตลาดในอนาคตของความสามารถของคุณพัฒนาระบบนิเวศที่อุดมไปด้วยฉันคิดว่าคุณควรจะเริ่มต้นด้วยJavaหรือC #


14
เมื่อเทียบกับ Haskell ทั้งสองภาษาค่อนข้างง่อย IMO
missingfaktor

9
การขอให้ Haskeller ย้ายไปที่ Java ก็เหมือนกับการขอให้ Bill Gates ย้ายไปอยู่ในสลัม : - /
missingfaktor

1
+1 สำหรับการแนะนำสิ่งที่จะทำให้คุณได้รับคะแนนโหวตลดลงอย่างแน่นอน Java และ C # มีระบบนิเวศที่ดีและได้รับการแนะนำอย่างมากสำหรับการทำงานที่จริงจัง คุณสามารถใช้ประโยชน์จากความรู้ Haskell (, Java และ C #) ได้อย่างชัดเจนเมื่อใช้ Clojure บน JVM หรือ F # บน CLR
ponzao

6
@ponzao: อืมไม่แนะนำว่ามีคนไปจาก Haskell ไป Java หรือ C # เป็นเรื่องที่น่ากลัวและโหดร้าย Scala, F # และ Clojure เป็นภาษาที่ดีกว่ามากโดยมีประโยชน์เหมือนกันทั้งหมดที่มาจากการทำงานบน JVM / CLR
CA McCann

5
สำหรับปรัชญาการวิเคราะห์ที่สำคัญ Java หรือ C # นั้นเสียเวลา
MaD70

0

คำถามที่ดี - ฉันถามตัวเองเมื่อเร็ว ๆ นี้หลังจากใช้เวลาหลายเดือนในการเพลิดเพลินกับ Haskell แม้ว่าภูมิหลังของฉันจะแตกต่างกันมาก (เคมีอินทรีย์)

เช่นเดียวกับคุณ C และ ilk นั้นไม่ต้องสงสัยเลย

ฉันได้รับการแกว่งระหว่าง Python และ Ruby ในฐานะภาษาสคริปต์ workhorse ที่ใช้งานได้จริงสองภาษาในวันนี้ (ล่อ?) ซึ่งทั้งสองมีส่วนประกอบที่ใช้งานได้เพื่อให้ฉันมีความสุข โดยไม่ต้องเริ่มการอภิปราย Rubyist / Pythonist ที่นี่ แต่คำตอบที่เป็นประโยชน์ส่วนตัวของฉันสำหรับคำถามนี้คือ:

เรียนรู้สิ่งหนึ่ง (Python หรือ Ruby) ที่คุณได้รับข้ออ้างในการสมัครก่อน

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