2008-10-07 31 views
114

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

+8

** Chú ý: ** nếu bạn quan tâm đến số phận của điều này câu hỏi, vui lòng tham gia thảo luận trên [Meta Stack Overflow] (http://meta.stackexchange.com/questions/131289/why-was-this-question-closed-f-and-ocaml/) hoặc thảo luận trong [trò chuyện ] (http://chat.stackoverflow.com/rooms/5/the-so-tavern-general) - nhận xét ở đây cực kỳ không hiệu quả, vì vậy tôi đã xóa chúng. – Shog9

+3

[Một so sánh khác] (http://pauillac.inria.fr/~nakata/FSharp.html) từ quan điểm của một nhà phát triển OCaml vì vậy nó khá thiên vị nhưng hữu ích dù sao. –

+1

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

Trả lời

79

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

  • functors
  • đối tượng kiểu OCaml
  • biến thể đa hình
  • các camlp4 Preprocessor

Ngoài ra, F # có một cú pháp khác nhau cho nhãn và tùy chọn các thông số.

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 hảo hợp lý với F # (và ngược lại, tôi sẽ tưởng tượng).

Danh sách đầy đủ các khác biệt là here (lưu ý: lưu trữ thay thế liên kết chết).

+3

Có tương đương camlp4 cho F # không? – nlucaroni

+0

Đừng nghĩ vậy. Nhưng bạn có thể ống chương trình của bạn thông qua camlp4 và vào trình biên dịch F #, có lẽ. (Không nên đề nghị nó.) –

+5

F # có cá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. Bạn sẽ gặp khó khăn khi sử dụng Camlp4 với F # vì F # gần như luôn luôn thụt đầu dòng nhạy cảm vì vậy nó sẽ cần một từ vựng mới và tài liệu Camlp4 trên lexers vẫn chưa được viết trong gần hai năm. –

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 sự khác biệt (không chắc chắn làm thế nào để cập nhật lên nó là)

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 sự hỗ trợ của trình biên dịch F # cho khả năng tương thích OCaml là rất 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 có thành F # vì trình biên dịch F # chết bên trong trên mã hợp lệ. –

+0

Tất cả các liên kết đều đã chết. – Wingjam

15

Tôi luôn mô tả F # là người 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ó khả năng nhận được. F # có liên quan chặt chẽ hơn với ngôn ngữ CAML trước đó. Đặc biệt, F # có hỗ trợ rất hạn chế cho trừu tượng và không hỗ trợ cho việc gõ cấu trúc (như OC2l's objectspolymorphic variants).

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

Tuy nhiên, đây là tất cả các tính năng nâng cao và bạn chắc chắn có thể bắt đầu nắm bắt những ý tưởng cơ bản đằng sau lập trình hàm kiểu OCaml quy mô nhỏ 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 đượ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 cách thực hiện điều đó trong F #, tài liệu chỉ có sẵn là this article on purely functional data structures. 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ã trên các loại (chẳng hạn như cấu trúc dữ liệu) nhưng các lựa chọn thay thế OOP không chỉ ghê tởm mà hầu 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 một cách tao nhã, tôi đã đánh trúng hàng tá lỗi trong trình biên dịch F # vì không ai thậm chí đã cố gắng làm điều này trước đâ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 tái sử dụng, tức là nó là một công việc cut'n'paste.

+25

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

+1

@Khi chúng dường như là một plug shameless cho những thứ Jon Harrop đã viết (anh ta được liệt kê là tác giả mỗi lần) – symbiont

+0

@symbiont Vâng, chúng ta biết một chút spam. Sẽ được tốt đẹp nếu bạn liên kết với một số thông tin bổ sung được miễn phí. Nhưng câu trả lời là tốt mà không có các liên kết, do đó, có bạn đang có. – Will

8

F # và OCaml là các lớp học về mặt thuế trong nhóm ngôn ngữ ML, bao gồm cả một loạt các động vật kỳ lạ khác. F # là mới hơn OCaml, và nó không có các hàm functors [của module -> module] hoặc các kiểu hàng [các lớp đối tượng và các biến thể đa hình]. Giữa chúng, hai sự đơn giản này có thể làm cho đường cong học tập dễ dàng hơn đối với người 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 sâu hơn về cách viết mã cho F # có thể dẫn đến thất vọng sớm với thứ hai khi nó có thể là một lựa chọn tuyệt vời cho C#.

104

Câu hỏi này đã được trả lời trong một thời gian, nhưng tôi khá ngạc nhiên khi hầu hết các câu trả lời đều nói rằng 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 báo được tham chiếu). Tuy nhiên, có nhiều tính năng mà làm cho F # một ngôn ngữ khác nhau (không chỉ là một phiên bản hạn chế về OCaml cho NET!) Dưới đây là một vài điều được thêm vào trong F #:

  • đơn vị đo lường cho phép bạn gõ-kiểm tra mã đối phó với các tính toán số
  • Meta-lập trình sử dụng dấu ngoặc (mà làm cho nó có thể sử dụng LINQ trong F # và cũng rất cần thiết cho các dự án promissing như nền tảng WebSharper)
  • mẫu tích cực cho tạo trừu tượng hóa cho dữ liệu chức năng loại (và tính năng thường rất hữu ích cho mô hình phù hợp với các ứng dụng phức tạp hơn)
  • Tính biểu thức mà là một tính năng ngôn ngữ behing quy trình công việc không đồng bộ (một thư viện cho I/O/dịch vụ web lập trình không đồng bộ/GUI)
  • .NET tương thích với hệ thống đối tượng có thể tương thích 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 - dĩ nhiên có một số lợi ích trong cả hai hệ thống).
  • Nhà khai thác quá tải - Theo như tôi biết, OCaml không có các toán tử quá tải - trong F # bạn có thể sử dụng + cho tất cả các kiểu 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 nói đến IDE Visual Studio. Đâ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, có nhiều thứ đóng góp phần lớn vào sự nổi tiếng của F # , do đó, nó không chỉ là "OCaml mà không có functors". 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 công việc không đồng bộ, .NET kiểu OO và lập trình meta, Bộ phận nhà phát triển Microsoft sẽ không bao giờ bao gồm F # trong Visual Studio 2010.

+10

Cảm ơn bạn! Hầu hết mọi người tập trung vào những gì còn thiếu trong F #, nhưng tôi cũng muốn xem những gì còn thiếu trong OCaml. –

+18

Woah! OCaml được đặc biệt lai tạo cho metaprogramming nó vượt trội hơn cả 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 cú pháp và trình phân tích cú pháp của OCaml là cách tốt hơn mọi thứ 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 giống như Visual Studio cho F #. –

+3

F # trích dẫn có mục tiêu hoàn toàn khác so với những gì có sẵn trong Camlp4 mặc dù (sang một bên, đây không phải là ngôn ngữ OCaml - nó là một hệ thống trên đầu trang của nó), vì vậy nó là không công bằng để 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 có gì để làm với các trích dẫn (cho phép những thứ như WebSharper, chạy F # trên GPU, v.v.) –

Các vấn đề liên quan