อะไรคือโครงการการเขียนโปรแกรมฟังก์ชั่นแรกที่ดี? [ปิด]


19

อะไรคือโครงการการเขียนโปรแกรมฟังก์ชั่นแรกที่ดี?

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

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

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

ข้อเสนอแนะสำหรับภาษาที่ดีที่สุดที่จะเริ่มต้นเมื่อเข้าสู่การเขียนโปรแกรมการทำงานจะได้รับการชื่นชมเช่นกัน


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

คำตอบ:


10

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

บางความคิดตามลำดับความยากลำบาก:

  • อัลกอริธึมทางพันธุกรรม - เขียนโปรแกรมที่พัฒนาโซลูชันไปยังงานเฉพาะที่โซลูชันนั้นแสดงใน DSL ที่เรียบง่าย ฉันสนุกมากก่อนที่จะสร้างบอทเล็ก ๆ ที่ตามล่าหาอาหารในตาราง 2D และพัฒนากลวิธีต่าง ๆ

  • การแยก combinators - สร้างparser combinator library ที่ให้คุณสร้าง parser สำหรับภาษาที่กำหนดเองโดยใช้ฟังก์ชันลำดับที่สูงขึ้น

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

ฉันแนะนำ Clojure เป็นภาษาที่ใช้งานได้จริง ฉันใช้มันมาประมาณ 18 เดือนแล้วและฉันก็มีความสุขมากกับตัวเลือก เหตุผลหลักคือ:

  • Concurrency - Clojure มีระบบ STM ที่น่าทึ่งซึ่งในมุมมองของฉันทำให้มันเป็นภาษาที่ดีที่สุดในโลกในขณะนี้สำหรับการทำงานพร้อมกันแบบมัลติคอร์ ดูวิดีโอได้ที่: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickeyหากคุณต้องการที่จะเข้าใจว่าทำไมมันถึงเป็นพิเศษ
  • มันเป็นเสียงกระเพื่อม - ดังนั้นเนื่องจาก "รหัสคือข้อมูล" ปรัชญาจึงยอดเยี่ยมสำหรับการใช้ metaprogramming แบบมาโคร (โปรแกรมที่เขียนโปรแกรม, อัลกอริทึมทางพันธุกรรมเป็นต้น)
  • ฟังก์ชั่นการเขียนโปรแกรมในทางปฏิบัติ - สไตล์ Clojure นั้นใช้งานได้ดีมาก (เน้นไปที่ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นลำดับที่ขี้เกียจ ฯลฯ ) แต่มันก็ไม่ได้บริสุทธิ์เหมือน Haskell มีเครื่องมือที่ดีมากมายในการจัดการกับสภาพ mtable และด้านข้าง
  • แบบไดนามิก - Clojure เป็นภาษาแบบไดนามิกโดยค่าเริ่มต้น ฉันพบว่านี่เป็นการเพิ่มประสิทธิภาพที่ยิ่งใหญ่ อย่างไรก็ตามคุณสามารถเลือกที่จะเพิ่มคำแนะนำประเภทคงที่ได้ในภายหลังหากคุณต้องการประโยชน์ด้านประสิทธิภาพของการพิมพ์แบบคงที่
  • รวบรวมอย่างสมบูรณ์ - โค้ด Clojure ปฏิบัติตามเสมอ (แม้ว่าคุณจะทำ "eval") ดังนั้นคุณจะได้รับประสิทธิภาพที่ดีพอสมควร - ดีกว่าภาษาไดนามิกส่วนใหญ่ที่ฉันเคยใช้
  • คุณสามารถเข้าถึงไลบรารีและเครื่องมือทั้งหมดในระบบนิเวศ JVMได้ฟรี ดังนั้นแตกต่างจากภาษาเชิงวิชาการที่มีไลบรารี จำกัด มากคุณสามารถเข้าถึงทุกสิ่งในจักรวาล Java ได้อย่างง่ายดาย

คุณสามารถลองใช้ข้อมูลเบื้องต้นได้อย่างง่ายดายด้วย:

  • 4Clojureชุดปัญหาออนไลน์ - ปัญหาต้นทำหน้าที่เป็นดี "การเรียนรู้โดยการทำ" แนะนำให้รู้จักกับภาษา Clojure
  • Clojure REPL ออนไลน์ได้ที่http://www.try-clojure.org/

ฉันเลือกคำตอบสำหรับคำถามเพราะตอบคำถามทุกข้อของฉัน ขอบคุณมากที่สละเวลา
Meme

Haskell มี STM ด้วยเช่นกัน (
ทางเลือก

@mikera: สำหรับการทำงานกับ JVM คุณลองใช้ ABCL แล้วหรือยัง? ฉันลองใช้และทำเพียงตัวอย่างเล็ก ๆ แต่ฉันแทบไม่มีประสบการณ์ (ฉันยังมีหนังสือ Clojure ในรายการสิ่งที่ต้องทำของฉัน แต่นี่เป็นอีกเรื่องที่ฉันอยากรู้ถ้าคุณมีประสบการณ์การทำงานกับ ABCL และ Java)
จอร์โจ

@Giorgio: ABCL ดูเหมือนว่ามันเป็นการใช้งาน Common LISP ที่ดีใน JVM OTOH Clojure มีข้อได้เปรียบของการออกแบบสำหรับ JVM ซึ่งรวมเอานวัตกรรม "ทันสมัย" มากขึ้นและมีแรงผลักดันของชุมชนมากขึ้น ฉันคิดว่ามันเข้ากันได้ดีกับว่าคุณสนใจที่จะรักษา Common LISP ให้เข้ากันได้หรือไม่
mikera

9

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

จุดเริ่มต้นที่ดีที่สุดน่าจะเป็นโครงสร้างและการแปลความหมายของโปรแกรมคอมพิวเตอร์ (SICP) ซึ่งใช้ภาษาของ Scheme of Lisp นี่คือข้อความ CS คลาสสิกและข้อความแบบเต็มสามารถออนไลน์ได้ (มีลิงก์)

หากคุณต้องการได้รับแฟนซีและใช้ภาษาการทำงานที่ทันสมัยมากขึ้นที่กำหนดเป้าหมาย JVM ลองดูที่ Clojure มีแม้กระทั่งปรับรุ่นของ SICP เฉพาะสำหรับ Clojure

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


ขอบคุณที่ให้ลิงค์สำหรับหนังสือ ฉันจะอ่านเพื่อทำความเข้าใจให้ดีขึ้น
Meme

คุณอ่าน SICP ของคุณวันนี้?
MattyD

3

การวิเคราะห์เชิงปริมาณ

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

ฉันแนะนำ F # เท่านั้นเพราะฉันคิดว่ามันเป็นภาษาที่ใช้งานง่ายในการเริ่มต้นมีเครื่องมือที่ดีและกรอบการทำงานที่ดี ทางเลือกอื่นคือเสียงกระเพื่อมและโสโครก แต่พวกเขาเรียนรู้ได้ยากขึ้นเล็กน้อย


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

1
ฉันไม่ได้บอกว่าในประสบการณ์ของฉันการวิเคราะห์เชิงปริมาณคือทั้งหมดที่เกี่ยวกับการใช้อัลกอริทึมในซีรีย์ ฉันได้ดำเนินการสิ่ง quant ใน C # และมันก็สอดคล้องอย่างมากกับ LINQ อย่างน้อยสำหรับชนิดทฤษฎีการลงทุนของสิ่ง
Homde

สิ่งที่เกี่ยวกับการใช้งานของอัลกอริทึมตัวเอง?
quant_dev

ฉันเห็นว่าไม่มีปัญหาในกรณีส่วนใหญ่คุณ? ใช้การคำนวณอัตราส่วนชาร์ปก่อนอื่นคุณต้องคำนวณผลตอบแทนรายปีจากซีรีย์ส่งคืนจากนั้นคุณใช้ค่านั้นด้วยอัตราความเสี่ยงและความผันผวนที่ไม่เป็นอันตราย: (annualizedReturn - riskFreeRate) / ความผันผวน ภาษาที่ใช้งานได้ไม่สามารถจัดการได้
Homde

สิ่งที่เกี่ยวกับการสอบเทียบรูปแบบการกำหนดราคา?
quant_dev

3

สำหรับการเริ่มต้นคุณสามารถลองใช้เกมแบล็กแจ็กตัวน้อยใน F # นี่เป็นโครงการการบ้านที่ได้รับมอบหมายระหว่างการสอนวิดีโอสั้น ๆนี้ โซลูชันมีให้ในเน็ต (และในหนึ่งในวิดีโอ)


2

คุณสามารถเขียนล่ามสำหรับแบบแผนหรือเสียงกระเพื่อมด้วย OCaml


นอกจากนี้ยังต้องทราบมีแม้กระทั่งหนังสือ Haskell เกี่ยวกับเรื่องนี้เกี่ยวกับการเขียนรูปแบบใน Haskell
ทางเลือก

2

คุณกำลังใช้ภาษาที่ใช้ในการทำงาน แต่ละคนมีลักษณะแตกต่างกัน ภาษาเดียวที่ทำให้ฉันมีผลกระทบมากที่สุดคือ Haskell และฉันขอแนะนำให้คุณทำเช่นเดียวกัน


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

ขอขึ้นอยู่กับว่าคุณอยู่ที่ไหนและทำอะไร สำหรับเราเทคโนโลยีการเขียนโปรแกรมของ Microsoft ไม่มีประโยชน์เนื่องจากไม่รองรับแพลตฟอร์มหลักของเรา แต่ฉันพูดนอกเรื่อง: ถ้าคุณต้องการใช้ F # ยอดเยี่ยม แต่จากนั้นเปิดคำถามเฉพาะ F # ใหม่

ฉันไม่ต้องการใช้สิ่งนั้น ฉันยังไม่ได้ตัดสินใจ คำถามเกี่ยวกับภาษาที่ใช้เป็นคำถามรอง
Meme

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

0

คุณสามารถมีส่วนร่วมในโครงการโอเพนซอร์สบางโครงการ

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

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