เป็นการยากที่จะกำหนดว่า "ภาษาที่ใช้งานได้" นั้นเป็นภาษาใด - ออกจากรายการที่คุณระบุมีเพียง Haskell เท่านั้นที่ทำงานได้อย่างหมดจด มีคุณสมบัติทางภาษาบางอย่างที่มีประโยชน์มากสำหรับการเขียนโปรแกรมใช้งานได้และ Ruby และ Python ไม่เพียงพอที่จะเป็นสภาพแวดล้อมที่ดีสำหรับ FP นี่คือรายการตรวจสอบส่วนบุคคลของฉันตามลำดับความสำคัญ:
- ฟังก์ชั่นชั้นหนึ่งและการปิด (Ruby, Python และอื่น ๆ ทั้งหมดที่คุณมีอยู่ในรายการ)
- รับประกันการเพิ่มประสิทธิภาพการโทรหาง (Erlang, Haskell, Scala และ Scheme มีสิ่งนี้ แต่ไม่ใช่ Python, Ruby หรือ Clojure (ยัง))
- รองรับการเปลี่ยนแปลงไม่ได้ในภาษาและไลบรารีมาตรฐาน (นี่เป็นสิ่งใหญ่ที่ "ภาษาที่ใช้งานได้" ทั้งหมดที่คุณระบุไว้มี (ยกเว้น Scheme) แต่ไม่มี Ruby และ Python
- การสนับสนุนระดับภาษาสำหรับฟังก์ชั่น (หรือบริสุทธิ์) อ้างอิงโปร่งใส (เท่าที่ฉันรู้เพียง Haskell มีสิ่งนี้ในปัจจุบัน)
ความต้องการ (1) ควรชัดเจน - ฟังก์ชั่นการเรียงลำดับที่สูงขึ้นนั้นยากมากหากไม่มีฟังก์ชั่นชั้นหนึ่ง เมื่อผู้คนพูดถึง Ruby และ Python เป็นภาษาที่ดีสำหรับ FP พวกเขามักพูดถึงเรื่องนี้ อย่างไรก็ตามคุณสมบัตินี้จำเป็น แต่ไม่เพียงพอที่จะสร้างภาษาที่ดีสำหรับ FP
(2) เป็นสิ่งจำเป็นดั้งเดิมสำหรับ FP นับตั้งแต่มีการคิดค้นโครงการ หากไม่มี TCO จะเป็นไปไม่ได้ที่จะตั้งโปรแกรมด้วยการเรียกซ้ำแบบลึกซึ่งเป็นหนึ่งในเสาหลักของ FP เพราะคุณจะได้รับสแต็กล้น ภาษา "ใช้งานได้" เท่านั้น (ตามคำจำกัดความนิยม) ที่ไม่มีนี่คือ Clojure (เนื่องจากข้อ จำกัด ของ JVM) แต่ Clojure มีแฮ็คที่หลากหลายเพื่อจำลอง TCO (FYI, Ruby TCO เป็นการนำไปใช้โดยเฉพาะแต่ Python ไม่สนับสนุนมันโดยเฉพาะ) เหตุผลที่ TCO ต้องมีการรับประกันก็คือถ้ามันเป็นฟังก์ชั่นเฉพาะการนำไปใช้งานฟังก์ชั่นวนซ้ำแบบลึกจะทำลายด้วยการใช้งานบางอย่าง ใช้พวกเขาเลย
(3) เป็นอีกเรื่องใหญ่ที่ภาษาการใช้งานสมัยใหม่ (โดยเฉพาะ Haskell, Erlang, Clojure และ Scala) มี Ruby และ Python อยู่ โดยไม่ต้องลงรายละเอียดมากเกินไปความไม่สามารถเปลี่ยนแปลงได้รับประกันว่าจะกำจัดข้อบกพร่องทั้งหมดในชั้นเรียนโดยเฉพาะอย่างยิ่งในสถานการณ์ที่เกิดขึ้นพร้อมกันโครงสร้างข้อมูลแบบถาวร เป็นการยากมากที่จะใช้ประโยชน์จากสิทธิประโยชน์เหล่านี้หากไม่มีการสนับสนุนระดับภาษา
(4) สำหรับฉันสิ่งที่น่าสนใจที่สุดเกี่ยวกับภาษาที่ใช้งานได้อย่างหมดจด (เมื่อเทียบกับภาษาผสม) ลองพิจารณาฟังก์ชั่น Ruby ที่ง่ายมาก ๆ ดังต่อไปนี้:
def add(a, b)
a + b
end
สิ่งนี้ดูเหมือนว่าเป็นฟังก์ชั่นแท้ ๆ แต่เนื่องจากการใช้งานเกินกำลังมันอาจกลายพันธุ์พารามิเตอร์หรือทำให้เกิดผลข้างเคียงเช่นการพิมพ์ไปยังคอนโซล ไม่น่าเป็นไปได้ที่ใครบางคนจะโอเวอร์โหลด+
โอเปอเรเตอร์จะมีผลข้างเคียง แต่ภาษาไม่รับประกัน (เช่นเดียวกับ Python แม้ว่าอาจไม่ได้มีตัวอย่างเฉพาะนี้)
ในทางกลับกันภาษาที่ใช้งานได้จริงมีการรับประกันระดับภาษาว่าฟังก์ชั่นนั้นมีความโปร่งใสในการอ้างอิง สิ่งนี้มีข้อดีมากมาย: ฟังก์ชั่นบริสุทธิ์สามารถจดบันทึกได้ง่าย สามารถทดสอบได้อย่างง่ายดายโดยไม่ต้องพึ่งพาสถานะระดับโลกใด ๆ และค่าภายในฟังก์ชั่นสามารถประเมินได้อย่างเกียจคร้านหรือขนานโดยไม่ต้องกังวลเกี่ยวกับปัญหาการเกิดพร้อมกัน Haskell ใช้ประโยชน์อย่างเต็มที่จากสิ่งนี้ แต่ฉันไม่รู้เกี่ยวกับภาษาอื่น ๆ ที่ใช้งานได้ดีพอที่จะรู้ได้
ทั้งหมดที่กล่าวมาเป็นไปได้ที่จะใช้เทคนิค FP ในเกือบทุกภาษา (แม้แต่ Java) ตัวอย่างเช่นMapReduceของ Google ได้รับแรงบันดาลใจจากแนวคิดการทำงาน แต่เท่าที่ฉันรู้ว่าพวกเขาไม่ได้ใช้ภาษา "การทำงาน" สำหรับโครงการขนาดใหญ่ของพวกเขา (ฉันคิดว่าพวกเขาส่วนใหญ่ใช้ C ++, Java และ Python)