F # thay đổi thành OCaml [đã đóng]


126

F # có nguồn gốc từ OCaml, nhưng những mặt hàng chính nào bị thiếu hoặc thêm vào? Cụ thể tôi tò mò liệu các tài nguyên có sẵn để học OCaml cũng hữu ích cho người muốn học F #.


3
Một so sánh khác từ quan điểm của một nhà phát triển OCaml vì vậy nó khá thiên vị nhưng dù sao cũng hữu ích.
Mauricio Scheffer

8
Chú ý: nếu bạn quan tâm đến số phận của câu hỏi này, vui lòng tham gia thảo luận về Meta Stack Overflow hoặc thảo luận về nó trong trò chuyện - các ý kiến ​​ở đây cực kỳ không hiệu quả, vì vậy tôi đã xóa chúng.
Shog9

1
@MauricioScheffer Liên kết bị hỏng!
JD

2
@JonHarrop Tôi nghĩ rằng liên kết này có thể là liên kết được cập nhật. (Tác giả Keiko Nakata)
Bart

Câu trả lời:


89

Sự khác biệt chính là F # không hỗ trợ:

  • chức năng
  • Đối tượng kiểu OCaml
  • biến thể đa hình
  • bộ tiền xử lý hoặc điểm mở rộng camlp4 / 5 (ppx)

Ngoài ra, F # có một cú pháp khác nhau cho các tham số tùy chọn và được gắn nhãn.

Về lý thuyết, các chương trình OCaml không sử dụng các tính năng này có thể được biên dịch bằng F #. Học OCaml là một giới thiệu hoàn toàn hợp lý về F # (và ngược lại, tôi tưởng tượng).

Danh sách đầy đủ về sự khác biệt có ở đây (lưu ý: archive.org thay thế liên kết chết).


3
Có một camlp4 tương đương với F # không?
nlucaroni

Đừng nghĩ vậy. Nhưng bạn có thể dẫn chương trình của bạn thông qua camlp4 và vào trình biên dịch F #. (Sẽ không khuyến nghị điều đó.)
Chris Conway

6
F # không có đối số được đặt tên và tùy chọn nhưng nó sử dụng một cú pháp và ngữ nghĩa khác nhau. Bạn sẽ gặp khó khăn khi sử dụng Camlp4 với F # vì F # hầu như luôn luôn thụt vào nên nó sẽ cần một từ vựng mới và tài liệu Camlp4 về các từ vựng vẫn chưa được đăng ký trong gần hai năm.
JD

4
Và bây giờ liên kết đã chết. Tôi cho rằng điều đó có thể tốt. Tôi chắc chắn F # đã được cải thiện kể từ '08.

1
Tôi đã nghe ở đâu đó rằng Microsoft không muốn thêm chức năng giống camlp4 vào F # vì họ lo lắng rằng chức năng đó có thể khuyến khích mọi người bắt đầu sử dụng các môi trường phát triển khác ngoài Microsoft Visual Studio.
chrismamo1

118

Câu hỏi này đã được trả lời một thời gian rồi, nhưng tôi khá ngạc nhiên khi hầu hết các câu trả lời đều nói những gì tính năng OCaml bị thiếu trong F # - điều này chắc chắn là tốt nếu bạn muốn chuyển các chương trình OCaml hiện tại sang F # (có lẽ là động lực của hầu hết các bài viết được tham khảo). Tuy nhiên, có nhiều tính năng làm cho F # trở thành một ngôn ngữ khác (không chỉ là phiên bản giới hạn của OCaml cho .NET!) Dưới đây là một số điều được thêm vào trong F #:

  • Đơn vị đo cho phép bạn kiểm tra mã kiểm tra xử lý các phép tính số
  • Lập trình meta bằng cách sử dụng trích dẫn (giúp có thể sử dụng LINQ trong F # và cũng rất cần thiết cho việc triển khai các dự án như nền tảng WebSharper)
  • Các mẫu hoạt động để tạo trừu tượng cho các loại dữ liệu chức năng (và nói chung là tính năng rất hữu ích cho các ứng dụng khớp mẫu phức tạp hơn)
  • Các biểu thức tính toán là một tính năng ngôn ngữ đằng sau các luồng công việc không đồng bộ (một thư viện để lập trình I / O / dịch vụ web / lập trình GUI không đồng bộ)
  • Hệ thống đối tượng tương thích .NET cho phép có thể tương tác hoàn toàn với nền tảng .NET (OCaml cũng có hỗ trợ cho các đối tượng nhưng khác nhau - tất nhiên có một số lợi ích trong cả hai hệ thống).
  • Toán tử quá tải - Theo như tôi biết, OCaml không có toán tử quá tải - trong F # bạn có thể sử dụng +cho tất cả các loại số cũng như các loại hỗ trợ.

Và, thành thật mà nói, tôi nghĩ rằng nó cũng đáng được đề cập đến Visual Studio IDE. Đây không phải là một phần của ngôn ngữ, nhưng nó thực sự cải thiện trải nghiệm người dùng (hỗ trợ IntelliSense trong Visual Studio thực sự tốt!)

Nếu bạn nhìn vào danh sách này, có rất nhiều điều đóng góp phần lớn vào sự phổ biến của F #, vì vậy nó không chỉ là "OCaml mà không có functor". F # chắc chắn dựa trên OCaml (và lấy ý tưởng từ các ngôn ngữ khác như Haskell) và chia sẻ nhiều khía cạnh với chúng, tuy nhiên cũng có rất nhiều thứ khác. Tôi đoán rằng nếu không có những thứ như quy trình làm việc không đồng bộ, OO kiểu .NET và lập trình meta, Bộ phận nhà phát triển của Microsoft sẽ không bao giờ bao gồm F # trong Visual Studio 2010.


18
Ái chà! OCaml được đặc biệt tạo ra cho siêu lập trình, nó vượt trội hơn rất nhiều so với F # và .NET trong bối cảnh đó. Camlp4 là một hệ thống báo giá mạnh mẽ hơn nhiều so với F #. Các trình phân tích và trình phân tích cú pháp của OCaml là cách tốt hơn bất kỳ thứ gì có sẵn cho .NET. Ngoài ra, các macro Camlp4 có sẵn để triển khai các mẫu hoạt động và biểu thức tính toán. OCaml cũng có các IDE cung cấp các lợi ích tương tự như Visual Studio làm cho F #.
JD

4
Các trích dẫn F # có mục tiêu hoàn toàn khác so với những gì có sẵn trong Camlp4 (ngoài ra, đây không phải là ngôn ngữ OCaml - đó là một hệ thống trên đầu trang), vì vậy thật không công bằng khi so sánh chúng. Sự tồn tại của Camlp4 chắc chắn là một lợi thế của OCaml, nhưng nó không liên quan gì đến các trích dẫn (cho phép những thứ như WebSharper, chạy F # trên GPU, v.v.)
Tomas Petricek

12
.... Làm thế nào để bạn giải quyết khiếu nại của mình rằng Camlp4 "không liên quan gì đến trích dẫn" với thực tế là Camlp4 cung cấp một cơ chế trích dẫn? Làm thế nào để bạn điều hòa hàm ý của mình rằng Camlp4 không thể tạo điều kiện thuận lợi cho Websharper khi công cụ ocamljs của SkyDeck đã biên dịch mã OCaml được trích dẫn bằng Camlp4 sang Javascript từ năm 2007?
JD

6
@Tomas: F # thậm chí không thể trích dẫn các biểu thức với các biến không liên kết như <@ a @>, chứ đừng nói đến các định nghĩa kiểu như <@ type t = int @>và nó không thể xử lý các ngữ pháp tùy ý và các trình phân tích cú pháp mở rộng ít hơn nhiều như Camlp4. Thiếu một hệ thống vĩ mô đàng hoàng là một thiếu sót, nhưng IMHO, việc thiếu bất kỳ nhà từ vựng và trình phân tích cú pháp nào cho F # là một trở ngại nghiêm trọng hơn nhiều. Tôi thực sự khuyên các nhà phát triển nên tạo các từ vựng và trình phân tích cú pháp của họ bằng OCaml, giới hạn bản thân trong tập hợp con mà F # hỗ trợ và chuyển nó trở lại F # để hưởng lợi từ hỗ trợ công cụ ưu việt của OCaml!
JD

8
@Erik: "Hầu hết mọi người tập trung vào những gì còn thiếu từ F #, nhưng tôi cũng muốn xem những gì còn thiếu từ OCaml". Lưu ý rằng các mẫu hoạt động, siêu lập trình, biểu thức tính toán và quy trình công việc không đồng bộ có sẵn trong OCaml trước khi chúng được đưa vào F #.
JD

16

Tôi luôn mô tả F # là anh em họ của OCaml vì OCaml có nhiều tính năng mà F # không có và không bao giờ có thể có được. F # liên quan chặt chẽ hơn với ngôn ngữ CAML trước đó. Cụ thể, F # có sự hỗ trợ rất hạn chế cho sự trừu tượng hóa và không hỗ trợ cho việc gõ cấu trúc (như các đối tượngbiến thể đa hình của OCaml ).

Trái với những gì một số người trả lời đã viết, F # có hỗ trợ (giới hạn) cho các đối số được gắn nhãn ("có tên") và tùy chọn.

Tuy nhiên, đây đều là những tính năng nâng cao và bạn chắc chắn có thể bắt đầu nắm bắt được những ý tưởng cơ bản đằng sau lập trình chức năng theo phong cách OCaml quy mô nhỏ bằng cách sử dụng tài nguyên về OCaml. Sự khác biệt lớn đầu tiên bạn sẽ khám phá là các vấn đề quy mô lớn hơn như đóng gói và trừu tượng hóa được giải quyết theo những cách hoàn toàn khác nhau trong OCaml và trong F #. Nếu bạn muốn tìm hiểu làm thế nào để làm điều đó trong F #, tài liệu duy nhất có sẵn là bài viết này về các cấu trúc dữ liệu chức năng thuần túy .

Tôi cũng đã phát hiện ra rằng hệ thống mô-đun tuyệt vời của OCaml giúp dễ dàng tham số hóa mã theo các loại (như cấu trúc dữ liệu) nhưng các lựa chọn thay thế OOP không chỉ gớm ghiếc mà gần như không được sử dụng trên .NET. Hơn nữa, khi cố gắng viết các cấu trúc dữ liệu được tham số hóa thanh lịch, tôi đã gặp hàng tá lỗi trong trình biên dịch F # vì trước đó chưa có ai cố gắng làm điều này. F # stdlib có chứa một số triển khai cấu trúc dữ liệu đẹp nhưng hầu như không sử dụng lại, tức là nó là một công việc cắt ghép.


28
Tất cả các liên kết yêu cầu đăng ký trả phí.

2
@ Sẽ dường như họ là một người không biết xấu hổ cho những điều Jon Harrop tự viết (anh ấy được liệt kê là tác giả mỗi lần)
cộng sinh

@symbiont Vâng, chúng tôi biết nó hơi spam. Sẽ tốt hơn nếu bạn liên kết với một số thông tin bổ sung miễn phí. Nhưng câu trả lời là tốt mà không có các liên kết, vì vậy bạn có.

@ Sẽ thật tuyệt nếu bạn tự liên kết một số thông tin bổ sung
symbiont

@symbiont Ý tôi là jon, không phải bạn, khi tôi nói "bạn". Nghe có vẻ lạ, đọc nó. Không chắc chắn nếu Jon xóa một bình luận xen kẽ. Dù sao đi nữa, bạn đi đây: Meta Stack Exchange

9

F # và OCaml là các lớp học phân loại trong họ ngôn ngữ ML, bao gồm cả một nhóm các động vật kỳ lạ khác. F # mới hơn OCaml và nó chưa có hàm functor [chức năng của mô-đun -> mô-đun] hoặc loại hàng [lớp đối tượng và biến thể đa hình]. Giữa chúng, hai sự đơn giản hóa đó có thể làm cho việc học tập dễ dàng hơn đối với ai đó đang phát triển trên nền tảng .Net. Đáng buồn thay, hai tính năng ngôn ngữ này cực kỳ mạnh mẽ trong OCaml, vì vậy đọc tài liệu OCaml để hiểu rõ hơn về cách viết mã cho F # có thể sẽ dẫn đến sự thất vọng sớm với cái sau khi nó có thể là một sự thay thế tuyệt vời cho C # khi cả hai đều có sẵn.


2

F # hỗ trợ cú pháp OCaml trực tiếp. Nó có thể không tương thích 100%, nhưng tôi nghĩ nó khá gần.

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

Dưới đây là danh sách các điểm khác biệt (không chắc nó cập nhật đến mức nào)

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


1
"F # hỗ trợ cú pháp OCaml trực tiếp. Nó có thể không tương thích 100%, nhưng tôi nghĩ nó khá gần". IME hỗ trợ của trình biên dịch F # cho khả năng tương thích OCaml là rất có lỗi. Điều này có thể gây khó khăn cho việc chuyển các cơ sở mã OCaml hiện tại sang F # vì trình biên dịch F # chết bên trong mã hợp lệ.
JD

Tất cả các liên kết đã chết.
Wingjam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.