F # เปลี่ยน OCaml [ปิด]


126

F # มาจาก OCaml แต่มีรายการหลักอะไรบ้างที่ขาดหายไปหรือเพิ่มเข้าไป? โดยเฉพาะฉันอยากรู้ว่าแหล่งข้อมูลสำหรับการเรียนรู้ OCaml นั้นมีประโยชน์กับคนที่ต้องการเรียนรู้ F # หรือไม่


3
การเปรียบเทียบอีกครั้งจากมุมมองของนักพัฒนา OCaml จึงค่อนข้างลำเอียง แต่ก็มีประโยชน์
Mauricio Scheffer

8
ข้อควรระวัง:หากคุณสนใจในชะตากรรมของคำถามนี้โปรดเข้าร่วมการสนทนาเกี่ยวกับMeta Stack Overflowหรือพูดคุยในการแชท - ความคิดเห็นที่นี่ไม่ก่อให้เกิดประโยชน์มากเกินไปดังนั้นฉันจึงลบออก
Shog9

1
@MauricioScheffer ลิงค์เสีย!
JD

2
@JonHarrop ฉันคิดว่าลิงค์นี้อาจเป็นลิงค์ที่อัปเดต (โดย Keiko Nakata)
Bart

คำตอบ:


89

ความแตกต่างที่สำคัญคือ F # ไม่รองรับ:

  • functors
  • วัตถุสไตล์ OCaml
  • ตัวแปรหลายชนิด
  • พรีโปรเซสเซอร์ camlp4 / 5 หรือจุดต่อขยาย (ppx)

นอกจากนี้ F # ยังมีไวยากรณ์ที่แตกต่างกันสำหรับพารามิเตอร์ที่มีป้ายกำกับและพารามิเตอร์เสริม

ตามทฤษฎีแล้วโปรแกรม OCaml ที่ไม่ใช้คุณสมบัติเหล่านี้สามารถคอมไพล์ด้วย F # การเรียนรู้ OCaml เป็นการแนะนำ F # ที่สมเหตุสมผลอย่างสมบูรณ์ (และในทางกลับกันฉันก็นึกภาพออก)

รายการความแตกต่างทั้งหมดอยู่ที่นี่ (หมายเหตุ: archive.org แทนที่ลิงก์ที่ตายแล้ว)


3
มีค่าเทียบเท่า camlp4 สำหรับ F # หรือไม่?
nlucaroni

อย่าคิดอย่างนั้น แต่คุณสามารถไพพ์โปรแกรมของคุณผ่าน camlp4 และไปยังคอมไพเลอร์ F # ได้ (ไม่อยากแนะนำ)
Chris Conway

6
F # มีการตั้งชื่อและอาร์กิวเมนต์ที่เป็นทางเลือก แต่ใช้ไวยากรณ์และความหมายที่แตกต่างกัน คุณจะมีปัญหาในการใช้ Camlp4 กับ F # เนื่องจาก F # มีความไวต่อการเยื้องเกือบตลอดเวลาดังนั้นจึงจำเป็นต้องมีตัวย่อใหม่และเอกสาร Camlp4 เกี่ยวกับไฟล์ lexers ยังคงไม่ได้เขียนเป็นเวลาเกือบสองปี
JD

4
และตอนนี้ลิงค์ก็ตายแล้ว ฉันคิดว่านั่นอาจจะดี ฉันแน่ใจว่า F # ได้รับการปรับปรุงตั้งแต่ปี '08

1
ฉันได้ยินมาบางแห่งว่า Microsoft ไม่ต้องการเพิ่มฟังก์ชันคล้าย camlp4 ให้กับ F # เพราะพวกเขากังวลว่าฟังก์ชันดังกล่าวอาจกระตุ้นให้ผู้คนเริ่มใช้สภาพแวดล้อมการพัฒนาอื่นที่ไม่ใช่ Microsoft Visual Studio
chrismamo1

118

คำถามนี้ได้รับคำตอบมาระยะหนึ่งแล้ว แต่ฉันค่อนข้างแปลกใจที่คำตอบส่วนใหญ่บอกว่าคุณสมบัติของ OCaml หายไปใน F # - นี่เป็นเรื่องดีที่จะทราบว่าคุณต้องการพอร์ตโปรแกรม OCaml ที่มีอยู่ไปยัง F # หรือไม่ (ซึ่งน่าจะเป็น แรงจูงใจของบทความอ้างอิงส่วนใหญ่) อย่างไรก็ตามมีคุณสมบัติมากมายที่ทำให้ F # เป็นภาษาอื่น (ไม่ใช่แค่ OCaml เวอร์ชัน จำกัด สำหรับ. NET!) นี่คือสองสิ่งที่เพิ่มเข้ามาใน F #:

  • หน่วยวัดที่อนุญาตให้คุณพิมพ์รหัสตรวจสอบที่เกี่ยวข้องกับการคำนวณตัวเลข
  • การเขียนโปรแกรมเมตาดาต้าโดยใช้ใบเสนอราคา (ซึ่งทำให้สามารถใช้ LINQ ใน F # ได้และยังจำเป็นสำหรับโปรเจ็กต์ที่มีสัญญาเช่นแพลตฟอร์ม WebSharper)
  • รูปแบบที่ใช้งานอยู่สำหรับการสร้าง abstractions สำหรับประเภทข้อมูลที่ใช้งานได้ (และโดยทั่วไปคุณสมบัติที่มีประโยชน์มากสำหรับแอปพลิเคชันการจับคู่รูปแบบที่ซับซ้อนมากขึ้น)
  • นิพจน์การคำนวณซึ่งเป็นคุณลักษณะของภาษาที่อยู่เบื้องหลังเวิร์กโฟลว์แบบอะซิงโครนัส (ไลบรารีสำหรับการเขียนโปรแกรม I / O / บริการเว็บ / GUI แบบอะซิงโครนัส)
  • ระบบอ็อบเจ็กต์ที่เข้ากันได้กับ. NETซึ่งทำให้สามารถทำงานร่วมกันได้อย่างเต็มที่กับแพลตฟอร์ม. NET (OCaml ยังรองรับอ็อบเจ็กต์ แต่แตกต่างกัน - แน่นอนว่ามีประโยชน์บางอย่างในทั้งสองระบบ)
  • ตัวดำเนินการที่โอเวอร์โหลด - เท่าที่ฉันรู้ OCaml ไม่มีตัวดำเนินการที่โอเวอร์โหลด - ใน F # คุณสามารถใช้+กับประเภทตัวเลขทั้งหมดและประเภทของคุณที่รองรับได้

และโดยสุจริตฉันคิดว่าการกล่าวถึง Visual Studio IDE ก็คุ้มค่าเช่นกัน นี่ไม่ใช่ส่วนหนึ่งของภาษา แต่ช่วยปรับปรุงประสบการณ์ของผู้ใช้อย่างแท้จริง (การรองรับ IntelliSense ใน Visual Studio นั้นดีมาก!)

หากคุณดูรายชื่อมีหลายสิ่งหลายอย่างที่ทำให้ F # ได้รับความนิยมเป็นอย่างมากดังนั้นมันจึงเป็นมากกว่าแค่ "OCaml without functors" F # ขึ้นอยู่กับ OCaml (และรับแนวคิดจากภาษาอื่นเช่น Haskell) และแบ่งปันแง่มุมต่างๆกับพวกเขาอย่างไรก็ตามยังมีสิ่งอื่น ๆ อีกมากมาย ฉันเดาว่าหากไม่มีสิ่งต่างๆเช่นเวิร์กโฟลว์แบบอะซิงโครนัส OO สไตล์. NET และการเขียนโปรแกรมเมตาแผนก Microsoft Developer จะไม่รวม F # ใน Visual Studio 2010


18
ว้าว! OCaml ได้รับการอบรมมาโดยเฉพาะสำหรับ metaprogramming ซึ่งเหนือกว่า F # และ. NET อย่างมากในบริบทนั้น Camlp4 เป็นระบบใบเสนอราคาที่มีประสิทธิภาพมากกว่า F # คำศัพท์และตัวแยกวิเคราะห์ของ OCaml เป็นวิธีที่ดีกว่าสิ่งที่มีอยู่ใน. NET นอกจากนี้ยังมีมาโคร Camlp4 ที่ใช้รูปแบบที่ใช้งานอยู่และนิพจน์การคำนวณ OCaml ยังมี IDE ที่ให้ประโยชน์เช่นเดียวกับ Visual Studio สำหรับ F #
JD

4
การเสนอราคา F # มีเป้าหมายที่แตกต่างกันอย่างสิ้นเชิงกับสิ่งที่มีอยู่ใน Camlp4 (นอกจากนี้ไม่ใช่ภาษา OCaml แต่เป็นระบบที่อยู่ด้านบน) ดังนั้นจึงไม่ยุติธรรมที่จะเปรียบเทียบ การมีอยู่ของ Camlp4 เป็นข้อได้เปรียบของ OCaml อย่างแน่นอน แต่ก็ไม่มีส่วนเกี่ยวข้องกับการเสนอราคา (ซึ่งอนุญาตให้ทำสิ่งต่างๆเช่น WebSharper การเรียกใช้ F # บน GPU เป็นต้น)
Tomas Petricek

12
@ โทมัส: คุณจะปรับการอ้างสิทธิ์ของคุณว่า Camlp4 "เป็นระบบที่อยู่เหนือ" OCaml ได้อย่างไรเมื่อ Camlp4 ถูกรวมเข้ากับ OCaml ที่ระดับไบนารีและสามารถกำหนดและใช้มาโคร Camlp4 ได้ทันทีใน OCaml REPL ที่กำลังทำงานอยู่ คุณจะกระทบยอดการอ้างสิทธิ์ของคุณว่า Camlp4 "ไม่มีส่วนเกี่ยวข้องกับใบเสนอราคา" ได้อย่างไรโดยที่ Camlp4 มีกลไกการเสนอราคา คุณจะกระทบความหมายของคุณได้อย่างไรว่า Camlp4 ไม่สามารถอำนวยความสะดวกให้กับ Websharper เมื่อเครื่องมือ ocamljs ของ SkyDeck ได้รวบรวมรหัส OCaml ที่อ้างถึงโดยใช้ Camlp4 เป็น Javascript ตั้งแต่ปี 2550
JD

6
@ โทมัส: F # ไม่สามารถแม้แต่จะอ้างนิพจน์ที่มีตัวแปรที่ไม่ถูกผูกไว้เช่น<@ a @>คำจำกัดความของประเภทเช่น<@ type t = int @>และไม่สามารถจัดการไวยากรณ์ตามอำเภอใจและตัวแยกวิเคราะห์ที่ขยายได้น้อยกว่าอย่างที่ Camlp4 ทำ การขาดระบบมหภาคที่ดีนั้นเป็นข้อบกพร่องอย่างหนึ่ง แต่ IMHO การขาดคำศัพท์และตัวแยกวิเคราะห์ที่เหมาะสมสำหรับ F # นั้นเป็นอุปสรรคที่ร้ายแรงกว่า ฉันแนะนำให้นักพัฒนาสร้างตัวย่อและตัวแยกวิเคราะห์โดยใช้ OCaml โดย จำกัด ตัวเองไว้ที่ชุดย่อยที่ F # รองรับและย้ายกลับไปที่ F # เพื่อรับประโยชน์จากการสนับสนุนเครื่องมือที่เหนือกว่าของ OCaml!
JD

8
@Erik: "คนส่วนใหญ่ให้ความสำคัญกับสิ่งที่ขาดหายไปจาก F # แต่ฉันก็อยากเห็นสิ่งที่หายไปจาก OCaml ด้วย" โปรดทราบว่ารูปแบบที่ใช้งานอยู่การเขียนโปรแกรมเมตานิพจน์การคำนวณและเวิร์กโฟลว์แบบอะซิงโครนัสมีอยู่ใน OCaml ก่อนที่จะสร้างเป็น F #
JD

16

ฉันมักจะอธิบายว่า F # เป็นลูกพี่ลูกน้องของ OCaml เพราะ OCaml มีคุณสมบัติมากมายที่ F # ไม่มีและไม่น่าจะได้รับ F # เกี่ยวข้องกับภาษา CAML ก่อนหน้ามากขึ้น โดยเฉพาะอย่างยิ่ง F # มีการสนับสนุนที่ จำกัด มากสำหรับสิ่งที่เป็นนามธรรมและไม่มีการรองรับการพิมพ์เชิงโครงสร้าง (เช่นวัตถุของ OCaml และตัวแปรโพลีมอร์ฟิก ) เลย

ตรงกันข้ามกับสิ่งที่ผู้ตอบบางคนเขียน F # มีการสนับสนุน (จำกัด ) สำหรับป้ายกำกับ ("ชื่อ") และอาร์กิวเมนต์ที่เป็นทางเลือก

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

ฉันยังค้นพบว่าระบบโมดูลที่ยอดเยี่ยมของ OCaml ทำให้ง่ายต่อการกำหนดพารามิเตอร์โค้ดตามประเภทต่างๆ (เช่นโครงสร้างข้อมูล) แต่ทางเลือก OOP นั้นไม่เพียง แต่น่ากลัว แต่แทบจะไม่ได้ใช้กับ. NET ยิ่งไปกว่านั้นเมื่อพยายามเขียนโครงสร้างข้อมูลที่กำหนดพารามิเตอร์อย่างหรูหราฉันพบข้อบกพร่องหลายสิบข้อในคอมไพเลอร์ F # เพราะไม่มีใครเคยพยายามทำสิ่งนี้มาก่อน F # stdlib มีการปรับใช้โครงสร้างข้อมูลที่ดี แต่แทบจะไม่มีการนำมาใช้ซ้ำกล่าวคือเป็นงานที่ตัดแล้วไม่วาง


28
ลิงก์ทั้งหมดต้องการการสมัครสมาชิกแบบชำระเงิน

2
@ ดูเหมือนว่าพวกเขาจะเป็นปลั๊กที่ไร้ยางอายสำหรับสิ่งที่ Jon Harrop เขียนด้วยตัวเอง (เขาถูกระบุว่าเป็นผู้เขียนทุกครั้ง)
symbiont

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

@ จะดีถ้าคุณเชื่อมโยงข้อมูลเพิ่มเติมด้วยตัวคุณเอง
symbiont

@symbiont ฉันหมายถึงจอนไม่ใช่คุณเมื่อฉันพูดว่า "คุณ" ฟังดูแปลก ๆ อ่านแล้ว ไม่แน่ใจว่าจอนลบความคิดเห็นคั่นระหว่างหน้าหรือไม่ จัดให้เลย: Meta Stack Exchange

9

F # และ OCaml เป็นคลาสอนุกรมวิธานในตระกูลภาษา ML ซึ่งรวมถึงสัตว์ประหลาดอื่น ๆ ด้วย F # ใหม่กว่า OCaml และยังไม่มีทั้ง functors [ฟังก์ชั่นของโมดูล -> โมดูล] หรือประเภทแถว [คลาสอ็อบเจ็กต์และตัวแปรโพลีมอร์ฟิก] ระหว่างนั้นความเรียบง่ายทั้งสองนี้อาจทำให้เส้นการเรียนรู้ง่ายขึ้นสำหรับผู้ที่พัฒนาบนแพลตฟอร์ม. Net น่าเศร้าที่คุณสมบัติสองภาษาเหล่านี้มีประสิทธิภาพอย่างมากใน OCaml ดังนั้นการอ่านวรรณกรรม OCaml เพื่อรับข้อมูลเชิงลึกเกี่ยวกับวิธีการเขียนโค้ดสำหรับ F # อาจทำให้เกิดความไม่พอใจก่อนเวลาอันควรในภายหลังเนื่องจากอาจเป็นทางเลือกที่ยอดเยี่ยมสำหรับ C # ซึ่งมีทั้งสองอย่าง


2

F # รองรับไวยากรณ์ OCaml โดยตรง มันอาจจะเข้ากันไม่ได้ 100% แต่ฉันคิดว่ามันค่อนข้างใกล้เคียง

http://plus.kaist.ac.kr/~shoh/fsharp/html/index.html

นี่คือรายการของความแตกต่าง (ไม่แน่ใจว่าเป็นปัจจุบันเพียงใด)

http://plus.kaist.ac.kr/~shoh/fsharp/html/fsharp-vs-ocaml.html


1
"F # รองรับไวยากรณ์ OCaml โดยตรงอาจไม่เข้ากันได้ 100% แต่ฉันคิดว่ามันค่อนข้างใกล้เคียง" IME การรองรับคอมไพเลอร์ F # สำหรับความเข้ากันได้ของ OCaml นั้นมีข้อบกพร่องมาก ซึ่งอาจทำให้ยากในการพอร์ตฐานรหัส OCaml ที่มีอยู่ไปยัง F # เนื่องจากคอมไพเลอร์ F # ตายภายในรหัสที่ถูกต้อง
JD

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