อะไรคือความแตกต่างที่ใหญ่ที่สุดระหว่าง F # และ Scala?


59

F # และ Scala เป็นทั้ง langugages โปรแกรมการทำงานที่ไม่ได้บังคับให้นักพัฒนาใช้เฉพาะประเภทข้อมูลที่ไม่เปลี่ยนรูป พวกเขาทั้งสองมีการสนับสนุนวัตถุสามารถใช้ไลบรารีที่เขียนในภาษาอื่นและเรียกใช้บนเครื่องเสมือน ดูเหมือนว่าทั้งสองภาษาจะใช้ ML

อะไรคือความแตกต่างที่ยิ่งใหญ่ที่สุดระหว่าง F # และ Scala แม้ว่าข้อเท็จจริงที่ว่า F # ได้รับการออกแบบสำหรับ. NET และ Scala สำหรับแพลตฟอร์ม Java?


2
หากคุณสามารถลงคะแนนและคิดว่านี่เป็นคำถามที่มีประโยชน์หรือมีคำตอบที่เป็นประโยชน์ด้านล่างโปรดลงคะแนน เว็บไซต์ StackExchange ต้องการคะแนนโหวตเพื่อสร้างชุมชนที่ดี คุณสามารถให้ 30 คะแนนต่อวันไม่ต้องเสียพวกเขา ผู้ใช้พิเศษที่มีชื่อเสียงและได้รับคะแนนเสียงน้อยโปรดอ่านสิ่งนี้: meta.programmers.stackexchange.com/questions/393/…
Maniero

functional programming langugages that don't force the developer to only use immutable datatypes- มีบ้างยกเว้นภาษาของเล่นบ้างมั้ย
Ingo

1
@Ingo ถ้าคุณคิดว่า ML และ Ocaml ไม่มีคุณสมบัติเป็นภาษาโปรแกรมที่ใช้งานได้เพราะพวกมันยอมให้ความไม่แน่นอนบางทีคุณควรปรับคำจำกัดความของคุณ!
Frank Shearar

3
+ แฟรงค์คุณต้องเข้าใจผิด: ฉันหมายถึงแม้ Haskell ก็มีประเภทข้อมูลที่ไม่แน่นอน ดังนั้นฉันยังต้องการที่จะรู้ว่าภาษาใดที่ @Jonas มีอยู่ในใจที่จะบังคับให้ใช้ประเภทข้อมูลที่ไม่เปลี่ยนรูปแบบเท่านั้น
Ingo

คำตอบ:


61

ความแตกต่างที่สำคัญ:

  • ทั้ง Scala และ F # ได้รวมการเขียนโปรแกรม OO -ative และการเขียนโปรแกรมเชิงหน้าที่ไว้ในภาษาเดียว แนวทางของพวกเขาที่มีต่อการรวมกระบวนทัศน์แตกต่างกันอย่างมากมาย สกาล่าพยายามหลอมรวมกระบวนทัศน์ทั้งสองเป็นหนึ่ง (เราเรียกมันว่ากระบวนทัศน์เชิงวัตถุ) ในขณะที่ F # ให้กระบวนทัศน์ทั้งสองแบบเคียงข้างกัน ตัวอย่างเช่นชนิดข้อมูลเชิงพีชคณิตใน F # เป็นโครงสร้างที่ใช้งานได้อย่างหมดจดโดยไม่มี OO'ness อยู่ในขณะที่ ADT ใน Scala ยังคงเป็นคลาสและวัตถุปกติ (หมายเหตุ: ในกระบวนการของการคอมไพล์ไปยัง CLR bytecode แม้แต่ F # ADTs ก็กลายเป็นคลาสและวัตถุ แต่พวกมันไม่สามารถมองเห็นได้โดยโปรแกรมเมอร์ F # ที่ระดับซอร์ส)

  • F # มีการอนุมานสไตล์แบบเต็มของ Hindley-Milner สกาล่ามีการอนุมานบางส่วน การสนับสนุนชนิดย่อยและ pure-OO-ness ทำให้การอนุมานสไตล์ของ Hindley-Milner เป็นไปไม่ได้สำหรับ Scala

  • Scala เป็นภาษาที่เรียบง่ายกว่า F # มาก สกาล่ามีชุดโครงสร้างแบบ orthogonal ขนาดเล็กมากซึ่งนำมาใช้ซ้ำทั่วทั้งภาษา F # ดูเหมือนว่าจะแนะนำไวยากรณ์ใหม่สำหรับทุกสิ่งดังนั้นจึงกลายเป็นไวยากรณ์ที่หนักมากเมื่อเทียบกับ Scala (Scala มี 40 คำหลักในขณะที่ F # มี 97 นั่นควรบอกคุณบางอย่าง :-)

  • F # เป็นภาษา Microsoft มีการสนับสนุน IDE ที่ยอดเยี่ยมในรูปแบบของ Visual Studio สิ่งที่ไม่ดีในด้านสกาล่า ปลั๊กอิน Eclipse ยังคงไม่เกินเครื่องหมาย ไปเหมือนกันสำหรับปลั๊กอิน NetBeans ความคิดที่ดูเหมือนจะเป็นทางออกที่ดีที่สุดของคุณในขณะนี้แม้ว่ามันจะไม่ได้ใกล้เคียงกับสิ่งที่คุณได้รับด้วย Java IDEs (สำหรับแฟน ๆ Emacs มี ENSIME ฉันเคยได้ยินสิ่งดีๆมากมายเกี่ยวกับแพ็คเกจนี้ แต่ฉันยังไม่ได้ลองเลย)

  • Scala มีระบบพิมพ์ที่มีประสิทธิภาพ (และซับซ้อน) มากกว่า F #


ความแตกต่างอื่น ๆ :

  • ฟังก์ชั่น F # ถูกปิดกั้นตามค่าเริ่มต้น ใน Scala มีบริการแกง แต่ไม่ค่อยได้ใช้บ่อยนัก

  • ไวยากรณ์ของ Scala เป็นการผสมผสานระหว่าง Java, Standard ML, Haskell, Erlang และภาษาอื่น ๆ อีกมากมาย ไวยากรณ์ของ F # ได้รับแรงบันดาลใจจาก OCaml, C # และ Haskell

  • Scala รองรับประเภทและประเภทของตัวพิมพ์ที่สูงขึ้น F # ไม่

  • Scala ตอบสนองต่อ DSL ได้มากกว่า F #


PS: ฉันรักทั้ง Scala และ F # และหวังว่าพวกเขาจะกลายเป็นภาษาหลักของแพลตฟอร์มที่เกี่ยวข้องในอนาคต :-)


6
คำตอบนี้จะทำให้เข้าใจผิดหลายครั้ง ฉันจะแจกแจงให้กัน คุณพูดว่า "พีชคณิตชนิดข้อมูลใน F # เป็นโครงสร้างที่ใช้งานได้อย่างหมดจดโดยไม่มี OO'ness อยู่" แต่ประเภทข้อมูลพีชคณิตใน F # เป็นเพียงคลาสและโดยเฉพาะพวกมันสนับสนุนการเพิ่มด้วย OO / สมาชิกแบบคงที่และคุณสมบัติ
Jon Harrop

7
คุณพูดว่า "สกาล่าพยายามที่จะหลอมรวมกระบวนทัศน์ทั้งสองเป็นหนึ่ง (เราเรียกมันว่ากระบวนทัศน์เชิงวัตถุ)" แต่สกาล่าขาดการกำจัดหางทั่วไปและดังนั้นรหัสการทำงานที่ไม่น่าสนใจใด ๆ (รวมถึงสำนวนการทำงานทั่วไปเกือบทั้งหมดเช่น สไตล์และการผูกปมแบบเรียกซ้ำ) มีแนวโน้มที่จะสแต็คล้นใน Scala และดังนั้นจึงไม่มีประโยชน์จริง
Jon Harrop

4
@ JonHarrop: Scala ไม่ได้ปฏิบัติต่อ ADT เป็นพิเศษ พวกเขาจะได้รับการปฏิบัติเช่นเดียวกับชั้นเรียนปกติ ดังกล่าวSome(2)ใน Scala มีประเภทSome[Int]และไม่ใช่Option[Int]IMO ที่ไม่พึงประสงค์ F # ในมืออื่น ๆ อื่น ๆ ที่มีไวยากรณ์พิเศษและการรักษา ADTs และทำให้ถูกต้องสามารถสรุปประเภทของการเป็นSome 2 int optionดังนั้นการเข้ารหัส F # ของ ADTs นั้นดีกว่าของ Scala (แน่นอน IMO) ฉันไม่ได้พยายามบอกเป็นนัยว่ามันด้อยกว่าและฉันขอโทษถ้ามันเจอแบบนั้น
missingfaktor

9
@JonHarrop: การขาด TCO ใน JVM ไม่ได้รบกวนผู้พัฒนาสกาล่าหลายคน เชื่อใจฉันมันไม่ใช่ปัญหาใหญ่เท่าที่คุณคิด ส่วนใหญ่เราใช้ฟังก์ชันคำสั่งซื้อที่สูงกว่าแทนที่จะเรียกซ้ำอย่างชัดเจน และฟังก์ชั่นการสั่งซื้อที่สูงที่สุดใน Scala นั้นถูกนำมาใช้ในแง่ของลูปไม่ใช่การเรียกซ้ำ ดังนั้นการขาด TCO จึงใกล้เคียงกับวัตถุ
missingfaktor

8
ฉันรู้สึกว่าคำตอบทั้งหมดนี้มีอคติเล็กน้อยต่อสกาล่า ตัวอย่างเช่นScala เป็นภาษาแบบเรียบง่ายมากกว่า F #ซึ่งดูเหมือนจะขัดแย้งกับประเด็น / จุดในภายหลังของระบบพิมพ์ที่ซับซ้อนมากขึ้น
Adam Gent

9
  • F # ถูกตัดสินในด้านการใช้งานในขณะที่สกาล่าขึ้นอยู่กับลักษณะเชิงวัตถุ
  • F # มีการสนับสนุน IDE ที่ดีกว่ากับ Visual Studio ในขณะที่ปลั๊กอิน eclipse ของ Scala สำหรับ IDE แบบโอเพ่นซอร์สและค่อนข้างช้ากว่า
  • F # มีลักษณะคล้าย ML มากกว่า Scala มีแคลคูลัสแลมบ์ดาน้อยที่สุดในแบบที่ OCaml, Standard ML และ Scheme มี F # ดูเหมือนจะเป็นภาษาที่ง่ายกว่ามาก

4
"F # ดูเหมือนจะเป็นภาษาที่ง่ายกว่ามาก" << ไม่มันไม่ใช่ มันใหญ่กว่าสกาล่า ฉันควรเขียนบทความเกี่ยวกับเรื่องนี้บางครั้ง
missingfaktor

4
"Scala ขึ้นอยู่กับลักษณะเชิงวัตถุ" << ผิด Scala พยายามที่จะหลอมรวม OOP และการเขียนโปรแกรมการทำงาน โดยส่วนตัวแล้วฉันไม่ค่อยใช้คุณสมบัติเชิงวัตถุ ส่วนใหญ่ของสิ่งที่เราทำคือการทำงานอย่างหมดจด
missingfaktor

@missingfaktor: "มันใหญ่กว่าสกาล่า" ไวยากรณ์มีขนาดใหญ่แค่ไหน?
Jon Harrop

1
ฉันไม่รู้ว่าสิ่งต่าง ๆ มีการเปลี่ยนแปลงหรือไม่ Scala ใน IntelliJ หินโดยที่ปลั๊กอินยังคงเป็นโอเพ่นซอร์ส
Colliot

0

จุดเล็ก ๆ แต่มีความสำคัญคือใบอนุญาต: Scala คือ BSD (สวยมากใบอนุญาตซอฟต์แวร์ฟรีอนุญาตมากที่สุดมี), F # เคยเป็น "ข้อตกลงสิทธิ์การใช้งานแหล่งข้อมูล Microsoft Research Shared Shared" แต่เป็นผลิตภัณฑ์เชิงพาณิชย์ในปัจจุบัน (ตาม @ Lorenzo ด้านล่าง แม้ว่าฉันจะไม่พบข้อตกลงสิทธิ์การใช้งานเพิ่มเติมที่ใดก็ได้)


3
ที่จริงแล้ว F # เป็นโอเพ่นซอร์สและ Scala เป็นผลิตภัณฑ์เชิงพาณิชย์ของ บริษัท Scala Solutions ของ Martin Odersky
Jon Harrop

4
@ จอน Harrop: ฉันคิดว่า Scala Solutions ขายเครื่องมือที่เกี่ยวข้องกับบริการงานฝึกอบรมและอื่น ๆ ที่เกี่ยวข้องกับสกาล่า
Joonas Pulakka

2
@ Joonas: แน่นอนเหมือนกันกับ F #
Jon Harrop

5
@JonHarrop: Scala ยังคงเป็นโอเพ่นซอร์ส กรุณาอย่ากระจายข้อมูลที่ผิด
missingfaktor

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