ภาษาการเขียนโปรแกรมฟังก์ชั่นที่บริสุทธิ์ที่สุด? [ปิด]


20

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

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


2
ผมได้เรียนรู้มิแรนดาที่มหาวิทยาลัยดังนั้นฉัน biassed แต่ฉันขอแนะนำให้Haskelให้กับทุกคนที่ต้องการที่จะสัมผัสและเรียนรู้ในภาษาทำงานโดยไม่มีการรบกวนของการปนเปื้อน * 8 ')
ทำเครื่องหมายบูธ

2
หลังจากคุณเรียนรู้การเขียนโปรแกรมฟังก์ชั่นเสร็จแล้วคุณควรเรียนรู้การเขียนโปรแกรมแบบสแตติกด้วยระบบชนิดที่แสดงออก ในหมวดหมู่ที่รวมกัน (ทั้งฟังก์ชั่นและการพิมพ์) ฉันแนะนำ: Coq> Haskell> OCaml> Scala> อื่น ๆ มีทางเลือกที่ได้รับความนิยมน้อยกว่าซึ่งอยู่ระหว่าง Coq และ Haskell (เช่น Epigram และ Agda) Haskell คิดถึงระบบโมดูลที่แสดงออกอย่างชัดเจนของ OCaml
lukstafi

คำตอบ:


28

ไม่มีการประเมินระดับความบริสุทธิ์ของภาษาเชิงหน้าที่ ถ้าภาษาอนุญาตให้มีผลข้างเคียงมันไม่บริสุทธิ์มิฉะนั้นจะบริสุทธิ์ ตามคำนิยามนี้ Haskell, Mercury, Clean ฯลฯ เป็นภาษาที่ใช้งานได้จริง ในขณะที่ Scala, Clojure, F #, OCaml ฯลฯ เป็นวัตถุที่ไม่บริสุทธิ์

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


6
ไม่มาก: Haskell อนุญาตผลข้างเคียง ( IOmonad) มันเป็นเพียงโค้ดที่ก่อให้เกิดผลข้างเคียงอย่างชัดเจน ฉันไม่คิดว่ามันจะมีประโยชน์ในการพูดภาษาบริสุทธิ์ / ไม่บริสุทธิ์เลย (Haskell ช่วยให้คุณเขียนโปรแกรมอย่างไม่น่าเชื่อ! อ้าปากค้าง!) แต่มันยังมีประโยชน์ในการพูดถึงส่วนของโค้ด (ฟังก์ชั่นโมดูลโปรแกรมอะไรก็ตาม) / ไม่บริสุทธิ์
Frank Shearar

8
@ Frank: ใช่ Haskell อนุญาตให้มีผลข้างเคียง แต่มันเป็นมากกว่าการทำเครื่องหมายโค้ดที่ทำให้เกิดผลข้างเคียง นอกจากนี้ยังรักษาความโปร่งใสในการอ้างอิงแม้ว่าจะใช้โค้ดที่ทำให้เกิดผลข้างเคียงและนั่นคือสิ่งที่ทำให้บริสุทธิ์ - อย่างน้อยก็ตามคำจำกัดความความบริสุทธิ์ของหลาย ๆ คน แน่นอนว่าไม่ตรงกับคำจำกัดความที่ขาดหายไปของคำว่า "ไม่อนุญาตให้มีผลข้างเคียง"
sepp2k

4
@ Frank Shearar แต่มันมีประโยชน์ที่จะพูดในลักษณะเช่นนี้เพราะIOmonad นั้นบริสุทธิ์ มันคือ runtime library ที่ไม่ได้ไม่ใช่รหัสของคุณเนื่องจากmainฟังก์ชั่นของคุณนั้นเป็นหม้อแปลงขนาดใหญ่ (บางอย่างเหมือนmain :: World -> Worldอยู่เบื้องหลัง)
ทางเลือก

1
ภาษาของฉันก็มีความโปร่งใสอ้างอิงเช่นกัน คุณเพิ่งเขียนprogram = "some C code"แล้วสภาพแวดล้อมรันไทม์เกี่ยวข้องกับรหัส C :-)
Daniel Lubarov

3
เนื่องจากการพิมพ์ออกมาทางหน้าจอเป็นผลข้างเคียงที่แท้จริงของโปรแกรมการทำงานที่น่าเบื่อ

15

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

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

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


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

2
การเขียนหลักฐานคือการเขียนโปรแกรมและการเขียนโปรแกรมเป็นการเขียนหลักฐาน เมื่อคุณเรียนรู้เกี่ยวกับแกงกะหรี่ - โฮมอร์มอร์ฟิซึ่มส์คุณจะรู้ว่าคุณผ่านอุปสรรคทางคณิตศาสตร์ไปแล้วหมื่นบรรทัดก่อนหน้า
Macneil

1
-1ไม่มีตัวแทนที่เรียบง่ายของเป็น
Daniel Lubarov

2
@Mason Wheeler: calcul-แคลคูลัสเพียงอย่างเดียวไม่มีตัวเลขหรือข้อมูลประเภทใด ๆ นอกเหนือจากแลมบ์ดา abstractions เว้นแต่จะระบุไว้ทุกคนพูดคุยเกี่ยวกับตัวเลขในλแคลคูลัสอาจหมายถึงการเข้ารหัสคริสตจักรของจำนวนธรรมชาติซึ่งเป็นจำนวน n เป็นตัวแทนจาก n เท่าองค์ประกอบฟังก์ชั่น ที่กล่าวว่าฉันสงสัยว่ามันเป็นที่การต่อสู้มากที่จะคิดออกลบเมื่อมีคนพยายามจริง; ฉันทำงานด้วยตัวเองในช่วงบ่ายเนื่องจากมีคำจำกัดความของการเพิ่มและความรู้ที่การลบเป็นไปได้
CA McCann

1
การลบโดยใช้เลขคริสตจักรเป็นเรื่องง่ายเมื่อคุณมีการสลายตัวตามกรณี สร้างแคลคูลัส (ที่ได้รับ) ทั้งหมดเพื่อรองรับจำนวนลบ, ทำงานได้มากกว่า
Donal Fellows

6

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

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

Haskell IO monad มาจากทฤษฎีทางคณิตศาสตร์ของ monads (แน่นอน) อย่างไรก็ตามสำหรับโปรแกรมเมอร์ที่มีความจำเป็นฉันคิดว่าวิธีการย้อนกลับมาที่ monads นั้นสมเหตุสมผลดีกว่า

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

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

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

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

นี่เป็นสิ่งที่ IO monad ทำได้ - ตัวดำเนินการเชื่อมโยงเป็นวิธีในการเขียน "การกระทำ" เพื่อสร้างโปรแกรม มันไม่มีอะไรพิเศษ - แค่ฟังก์ชั่น นิพจน์และฟังก์ชันจำนวนมากสามารถประเมินได้ในช่วง "การสร้างโค้ด" แต่สิ่งที่ขึ้นอยู่กับผลข้างเคียงของ I / O จะต้องมีการประเมินผลล่าช้าจนกว่าจะถึงเวลารันไทม์ - ไม่ใช่โดยกฎพิเศษใด ๆ การแสดงออก

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

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

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

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

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


ขอขอบคุณ! ฉันสงสัยว่าความมีชีวิตชีวาของแม่แบบ C ++ นั้นสามารถรวมเข้ากับฟังก์ชั่นของตัวเองได้หรือไม่ ดูเหมือน Haskell ไม่นี้ แต่ส่วนที่สำคัญคือว่านี้สามารถดำเนินการในการรวบรวมภาษาดังกล่าวที่เครื่องยนต์เดียวกันการสร้างฟังก์ชั่นทั่วไปจากแม่ในระหว่างการรวบรวมเวลานอกจากนี้ยังสามารถประเมินพวกเขาในช่วงเวลาทำงาน ...
Milind R

5

ฉันจัดหมวดหมู่ภาษาเป็นการส่วนตัวสามระดับด้วยความบริสุทธิ์ที่ใช้งานได้:

  • ภาษาที่ใช้งานได้จริง - เช่นภาษาที่ปฏิบัติต่อโปรแกรมทั้งหมดของคุณในฐานะฟังก์ชั่นที่บริสุทธิ์และจัดการกับความผันแปรเพียงอย่างเดียวผ่านการโต้ตอบกับรันไทม์ - Haskellอาจเป็นตัวอย่างที่ยอมรับได้

  • ภาษาหน้าที่ไม่บริสุทธิ์ - เช่นภาษาที่เน้นสไตล์การใช้งาน แต่ให้ผลข้างเคียง Clojureชัดเจนในหมวดหมู่นี้ (อนุญาตให้มีการกลายพันธุ์ในแบบควบคุมซึ่งเป็นส่วนหนึ่งของเฟรมเวิร์ค STM), ยังOCamlหรือF #

  • ภาษาแบบหลายกระบวนทัศน์ - ภาษาเหล่านี้ไม่ใช่ภาษาที่ใช้งานได้เป็นอันดับแรก แต่สามารถรองรับสไตล์การใช้งานได้โดยใช้ฟังก์ชั่นชั้นหนึ่งเป็นต้นสกาล่าเป็นตัวอย่างที่ดีที่นี่ฉันจะใส่Common LISPในหมวดหมู่นี้ ภาษาเช่นJavaScript

ในสถานการณ์ของคุณฉันขอแนะนำให้เรียน Haskell ก่อนจากนั้น Clojure นี่คือสิ่งที่ฉันทำและมันทำงานได้ดีมากสำหรับฉัน! แฮสเค็ลล์มีความสวยงามและสอนคุณเกี่ยวกับหลักการทำงานที่บริสุทธิ์ที่สุด Clojure นั้นสามารถใช้งานได้จริงมากขึ้นและช่วยให้คุณทำงานได้สำเร็จมากขึ้นในขณะที่ยังคงทำงานได้ดีในหัวใจ

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


ภายในข้อ จำกัด ที่เข้มงวดแม้กระทั่ง C มีความสามารถในการใช้งาน (ข้อ จำกัด หลักคือการสังเคราะห์ฟังก์ชั่นรันไทม์ซึ่งน่ากลัวอย่างแท้จริงใน C มากจนคนส่วนใหญ่อ้างว่าทำไม่ได้)
Donal Fellows

2
@ Donal Fellows: ในขีด จำกัด เมื่อความมีสติไปถึงความไร้ขอบเขตภาษาทัวริงที่สมบูรณ์แบบนั้นใช้งานได้: เราต้องการเพียงใช้ล่าม Lisp ในภาษาจากนั้นใช้สิ่งนั้น :]
CA McCann

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

@mikera: ฉันคิดว่าคำตอบของคุณน่าสนใจมาก: ถ้า Scala ไม่สามารถใช้งานได้ แต่มีหลายกระบวนทัศน์คุณจะตัดสินคุณสมบัติการเขียนโปรแกรมเชิงหน้าที่ใน C ++ 11, C # หรือ Java (การแนะนำของ lambdas) ได้อย่างไร?
Giorgio

@Giorgio: ฉันคิดว่าคุณสมบัติการใช้งานในทุกภาษาที่คุณพูดถึงอาจเป็นความคิดที่ดีพวกเขาไม่ได้ทำให้พวกเขาเป็น "ภาษาที่ใช้งานได้" หรือการมองจากทิศทางตรงกันข้ามความจริงที่ว่าคุณสามารถทำ monadic IO แบบบังคับได้ไม่ได้ทำให้ Haskell เป็นภาษาที่จำเป็น :-) ภาษาแบบหลายกระบวนทัศน์นั้นเป็นผลลัพธ์เมื่อคุณนำคุณสมบัติจากกระบวนทัศน์ที่แตกต่างกันมารวมกันและไม่ได้ใส่รูปแบบใดเป็นพิเศษก่อนอื่น IMHO C ++, C # และ Java ล้วน แต่เปลี่ยนไปสู่การเป็นแบบหลายกระบวนทัศน์ แต่ยังไม่ค่อยมีในขณะนี้เนื่องจาก OOP แบบอิงคลาสยังคงมีบทบาทสำคัญ
mikera

3

หากภาษาที่ใช้งานได้จริงนั้นมีเพียงฟังก์ชั่นแท้ๆ (กิจวัตรที่ไม่มีผลข้างเคียง) แสดงว่ามันไม่มีประโยชน์เพราะมันไม่สามารถอ่านอินพุตหรือเขียนเอาต์พุตได้)

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

ฉันจะบอกว่าตอนนี้: แฟชั่นการเขียนโปรแกรมเป็นคนโง่และต่อต้าน สิ่งเดียวที่สำคัญคือโปรแกรมของคุณสั้นเขียนง่ายบำรุงรักษาง่ายและทำงานได้อย่างถูกต้อง วิธีที่คุณประสบความสำเร็จสิ่งนี้ไม่เกี่ยวกับการเขียนโปรแกรม fads - ริชาร์ดโจนส์

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


3

ไม่ใช่คำตอบที่จริงจัง แต่Unlambdaจะต้องเป็นคู่แข่ง คุณไม่สามารถรับ "ฟังก์ชั่นบริสุทธิ์" ใด ๆ ได้มากกว่าสกิล combiner ของ SKI


4
บ้า! บาป! ภาษาบริสุทธิ์ชนิดใดที่มีเรื่องไร้สาระเช่นผู้ประสานงานที่มีผลข้างเคียง ไม่ไม่. สิ่งที่คุณต้องการที่นี่คือขี้เกียจ K
CA McCann

2

Erlang, Haskell, Scheme, Scala, Clojure และ F #

คำถามนี้อาจจะดีที่สุดที่คุณช่วยคุณในการค้นหาของคุณเป็นอย่างดี


ขอบคุณคำถามที่น่าสนใจแน่นอน ฉันเริ่มต้นด้วย PLT-Scheme / Racket แต่ฉันยังไม่ได้ดู SICP เลย ... Real World Haskell ก็ดูน่าสนใจเช่นกัน
Joanis

โครงการส่งเสริมให้รูปแบบการทำงาน แต่ก็ไม่ได้set!(ในหมู่สิ่งอื่น ๆ ) ...
แดเนียล Lubarov

ฉันแนะนำ OCaml เพราะมันเป็นที่ชื่นชอบ และก็มีระบบโมดูลซึ่ง Haskell และ F # miss
lukstafi

@ lukstafi อาจจะมีการเปลี่ยนแปลงของ haskell ในช่วง 3 ปีที่ผ่านมา (ฉันรู้ว่ามันโตขึ้นอย่างบ้าคลั่ง) แต่มีโมดูลใน Haskell แน่นอน
sara

@kai โดยระบบโมดูลฉันหมายถึงโมดูลที่กำหนดพารามิเตอร์โดยโมดูลอื่น ๆ ("แคลคูลัสแลมบ์ดา" ของโมดูล)
lukstafi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.