ข้อดีของการใช้ LISP และ Haskell คืออะไร พวกเขาจะทำให้ฉันเป็นโปรแกรมเมอร์ที่ดีขึ้นหรือไม่ [ปิด]


40

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


35
การใช้ LISP และ Haskell จะทำให้คุณเป็นโปรแกรมเมอร์ LISP และ Haskell ที่ดีขึ้นฉันรับประกันได้เลย
Neil

17
@MasonWheeler ฉันต้องพูด; มีระบบการพิมพ์ของ Haskell มากมายที่คุณจะไม่พบในภาษาอื่นและมาโคร LISP ไม่สามารถพบได้ในภาษาหลักใด ๆ ทั้งสองสิ่งเหล่านี้มีมูลค่าการเรียนรู้เพราะพวกเขาจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นในภาษาการทำงานของคุณ อย่างน้อยนี่ก็เป็นประสบการณ์ของฉัน Haskell ทำให้ฉันเป็นนักพัฒนา C # ที่ดีขึ้น ฉันรู้เทคนิคในการแยกความกังวลออกจากกันอย่างหมดจดซึ่งฉันไม่เคยมีมาก่อนและการแยกวิเคราะห์ปัญหาจะง่ายกว่าสำหรับฉันมากกว่าก่อนที่ฉันจะเรียนรู้ Haskell
Jimmy Hoffa

6
Erlang เป็นภาษาที่ใช้งานได้ Rabbit MQ เขียนขึ้นใน Erlang และ Rabbit ใช้ในหลายสถานที่เพื่อทำภารกิจมากมายในการยกของหนัก ๆ ภาษาที่ใช้งานได้จะสอนให้คุณคิดต่าง ๆ เกี่ยวกับการเขียนโปรแกรมและนั่นเป็นเครื่องมือพิเศษที่น่าใช้ ในขณะที่มันเป็นความจริงบางแนวคิดเหล่านั้นทำให้มันเป็นภาษาที่นิยมมากขึ้น (เช่นการแสดงออกแลมบ์ดาใน C # และ C ++) คุณยังคงเข้าใกล้การแก้ปัญหาในวิธีที่แตกต่างกันมากเมื่อใช้ภาษาที่ใช้งานได้
Binary Worrier

8
@MasonWheeler มีเหตุผลที่ดีอย่างสมบูรณ์ภาษาอาจมีประโยชน์มากกว่าส่วนที่เหลือ แต่ก็ยังไม่ได้ใช้กันอย่างแพร่หลาย ฉันสามารถนึกถึงหลาย ๆ อย่าง: ฐานผู้ใช้ที่มีอยู่การเปลี่ยนแปลงที่รุนแรงเกินไปเมื่อ "ดีดีพอ" และยัง ... เมื่อเครื่องมือที่ดีกว่าต้องใช้โปรแกรมเมอร์ที่ได้รับการฝึกฝนอย่างเป็นทางการมากกว่า ดังนั้นความนิยมไม่ได้เป็นตัวชี้วัดที่ดีของประโยชน์
Andres F.

5
@MasonWheeler ในการใช้การเปรียบเทียบคณิตศาสตร์เป็นสนามที่มีประโยชน์อย่างมากในชีวิตจริง แล้วทำไมผู้คนถึงไม่เก่งคณิตศาสตร์ ทำไมผู้คนมากมายถึงกลัวและคิดว่ามันเป็นเวทมนตร์สีดำและไม่ได้มีประโยชน์อะไรเลย?
Andres F.

คำตอบ:


37

มันเป็นเหมือนการเรียนรู้คณิตศาสตร์ที่จะพัฒนาทักษะการวิเคราะห์ของคุณและการเรียนรู้วรรณกรรมละติน / คลาสสิกจะพัฒนาทักษะการเขียนของคุณ

ผู้ที่ออกแบบภาษาเหล่านั้นมีความคิดมากเกี่ยวกับการเขียนโปรแกรมหมายถึงอะไร และภาษาเหล่านั้นเป็นผลจากการวิจัยเหล่านั้น

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

แก้ไข

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

LISP

เสียงกระเพื่อมเชื่อว่าไวยากรณ์ควรน้อยที่สุดและทุกอย่างควรเป็นรายการหรือดั้งเดิม (Lisp ย่อมาจาก List Processing) แม้แต่โปรแกรมส่วนใหญ่จะเป็นรายการที่มีรายการและสัญลักษณ์อื่น ๆ เสียงกระเพื่อมช่วยให้คุณสามารถจัดการโปรแกรมเป็นรายการและเพื่อสร้างโปรแกรมใหม่ได้ทันที ดังนั้นcode is data and data is codeคำขวัญทั้งหมด

ผลที่ตามมาโดยตรงคือภาษา Lisp อนุญาตให้คุณกำหนดส่วนต่อประสานที่คุณต้องการ ตัวอย่างที่ดีคือ compojure ซึ่งเป็นเฟรมเวิร์กของเว็บ นี่คือลักษณะของฟังก์ชั่นการกำหนดเส้นทาง

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

ตัวอย่างที่ดีอีกประการหนึ่งคือกรอบการทำแม่แบบสะอึก:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

ที่คุณสามารถดูผลที่ได้คือเป็นสั้นในขณะที่ DSL เช่นหนวด (for [x (range 1 4)] block)แต่ช่วยให้คุณใช้ภาษาที่ให้บริการเช่น แม้กระทั่ง nicer คุณมีเครื่องมือทั้งหมดที่เป็นนามธรรมและจัดโครงสร้างโค้ดของคุณ

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

Haskell

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

สิ่งหนึ่งที่สำคัญคือคุณไม่สามารถทำการกระทำ IO ได้ทุกเมื่อที่คุณต้องการ (Haskellers เชื่อว่านี่เป็นสิ่งที่ดี) การกระทำของ IO นั้นถูกกำหนดให้เป็นธุรกรรมซึ่งล้วนเป็นคุณค่าที่แท้จริง mainค่าของโปรแกรม Haskell จะทำธุรกรรม IO ดำเนินการเมื่อคุณเรียกใช้โปรแกรม

คุณต้องจัดการกับกระแสข้อมูลในโปรแกรมของคุณอย่างชัดเจน คุณไม่สามารถสื่อสารสององค์ประกอบโดยการเขียนและอ่านสิ่งต่าง ๆ ในตัวแปรส่วนกลาง คุณต้องสร้างและส่งผ่านค่า

คุณสมบัติอื่นที่กล่าวถึงโดย Jimmy Hoffa คือระบบการพิมพ์ที่หลากหลาย ในขณะที่ภาษาอื่นมีการพิมพ์แบบคงที่ใน Haskell คุณสามารถมีสิ่งต่าง ๆ เช่น:

length :: [a] -> Int (ฟังก์ชั่นจากรายการของ a ไปยัง int)

map :: (a -> b) -> [a] -> [b](ฟังก์ชันที่รับการa to bแปลงและรายการ a's และส่งคืนรายการ b's)

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

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

ไม่ว่าคุณจะใช้เส้นทางที่ปลอดภัย (เช่นสกาล่า) และจบลงด้วยภาษาที่ซับซ้อนจริงๆหรือคุณใช้เส้นทางที่เรียบง่ายและได้รับสิ่งที่ จำกัด (google go generics จำกัด เฉพาะรายการและแผนที่) หรือไม่ปลอดภัย (generics โผที่มักจะเป็น covariant)

โดยใช้ Haskell คุณส่วนใหญ่เรียนรู้เกี่ยวกับประโยชน์ของความบริสุทธิ์และวิธีการเขียนรหัสบริสุทธิ์


1
@ JimmyHoffa ฉันคิดว่าจริง ๆ แล้วสมควรได้รับคำตอบของตัวเองเพราะนี่คือสิ่งที่ผู้คนมักจะมองข้าม มีโดเมนปัญหาที่แก้ไขได้ดีที่สุดโดยการเขียนโปรแกรมการทำงานที่ผู้คนไม่ได้ตระหนักถึงอยู่จนกว่าพวกเขาจะ dabbled อย่างน้อยในโดเมนเหล่านั้นนอกเขตความสะดวกสบายของพวกเขา
KChaloux

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

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

7
OMG, @ ไม่มีใครรู้ว่าคอมพิวเตอร์กำลังทำอะไรอยู่อย่างมั่นใจที่สุดจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น ฉันยังไม่ได้เขียนการชุมนุมในปีที่ผ่านมา แต่อ่านมันเป็นประจำ (ในหลาย ๆ แพลตฟอร์ม) และถ้าคุณสนใจว่าโปรแกรมของคุณทำงานอย่างไรมันเป็นเรื่องสำคัญที่จะต้องรู้พื้นฐานอย่างน้อย
dash-tom-bang

3
@ Neil ในกรณีที่การเขียนโปรแกรมที่เลวร้ายกว่าผลประโยชน์คืออะไร? อะไรที่ทำให้คุณมีรหัสสปาเก็ตตี้ สปาเก็ตตี้รหัสเกี่ยวข้องกับการประกอบหรือเป็นโปรแกรมเมอร์ที่ดียกเว้นในดินแดนแฟนตาซีที่ไม่รู้จักการประกอบและต้องการการหาเหตุผลเข้าข้างตนเองเพื่อหลีกเลี่ยงการเรียนรู้ หากมีสิ่งใดการเป็นแอสเซมบลี coder ที่ดีทำให้หนึ่งตระหนักถึงวิธีการเข้ารหัสที่ไม่ดี
dash-tom-bang

12

tl; drการเรียนรู้สิ่งใหม่ ๆ สามารถทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น แต่การเป็นโปรแกรมเมอร์ที่ดีขึ้นไม่ได้เกี่ยวกับภาษาที่คุณสามารถเขียนโค้ดได้

ข้อดีของการใช้ LISP และ Haskell คืออะไร

LISP:

  1. รหัส homoiconic สิ่งนี้อนุญาตให้ใช้โค้ดแก้ไขตัวเองที่มีโครงสร้าง
  2. มาโครที่รับรู้ไวยากรณ์ อนุญาตให้เขียนโค้ดสำเร็จรูปได้อีกครั้ง
  3. ปฏิบัตินิยม CL ถูกออกแบบมาเพื่อทำงานให้เสร็จโดยมืออาชีพ ภาษาที่ใช้งานได้ส่วนใหญ่ไม่ได้เป็นกฎ
  4. มีความยืดหยุ่น มันสามารถทำสิ่งต่าง ๆ มากมายด้วยความเร็วที่สมเหตุสมผล
  5. Wartiness โลกแห่งความจริงยุ่งเหยิง การเข้ารหัสในทางปฏิบัติทำให้ต้องใช้หรือสร้างโครงสร้างที่ยุ่งเหยิง เสียงกระเพื่อมสามัญมี wartiness เพียงพอที่จะสามารถทำสิ่งต่าง ๆ

เหตุผลที่แท้จริงเพียงเหตุผลเดียวในการเลือกกับ CL คือไลบรารีมาตรฐานมีวันที่

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

จาก: ทำไม Lisp จึงมีประโยชน์

Haskell:

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

คุณสามารถอ่านคำอธิบายของฟังก์ชั่น vs ความจำเป็นได้

จาก: http://www.haskell.org/haskellwiki/Introduction

พวกเขาจะทำให้ฉันเป็นโปรแกรมเมอร์ที่ดีขึ้นหรือไม่

ใช่แน่นอนว่าการรู้ภาษาและกระบวนทัศน์มากขึ้นจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นเท่านั้น

ไม่มีเครื่องมือเดียวหนังสือเล่มเดียวกระบวนทัศน์การเขียนโปรแกรมเดียวที่จะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น

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

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

ฉันคิดว่ายิ่งคุณมีความคิดในระดับโลกมากเท่าไหร่คุณก็ยิ่งพัฒนามากขึ้นเท่านั้น

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

การเปิดเผยข้อมูล: นี่เป็นการโฆษณาที่ไร้ยางอายเพราะมันมาจากบล็อกของฉัน


4
คุณเรียนรู้ LISP หรือ Haskell ในระดับที่มีความสามารถหรือไม่?
Jimmy Hoffa

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

10
นี่ไม่ได้ตอบคำถามจริงๆ คุณประสบความสำเร็จด้วยความประทับใจในการให้คำตอบทั่วไปเกี่ยวกับสองภาษาที่คุณไม่รู้: /
Andres F.

2
-1 เพราะสิ่งนี้เป็นการเต้นรำรอบ ๆสิ่งที่ Common Lisp และ Haskell สอน ตัวอย่าง: รหัสเป็นข้อมูลข้อมูลเป็นรหัสที่มีความบริสุทธิ์โปร่งใสอ้างอิงนามธรรมเอก, โปรแกรมการทำงาน, การเขียนโปรแกรมภาษาที่มุ่งเน้นการพิมพ์การเขียนโปรแกรมกำกับ ฯลฯ ฯลฯ ฯลฯ
jozefg

3
นอกจากนี้ฉันไม่รู้ว่าจะใช้ภาษาใดฉันไม่คิดว่าคุณสามารถตอบคำถามนั้นได้: / ขออภัย
jozefg

9

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

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

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