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 #.
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 #.
Câu trả lời:
Sự khác biệt chính là F # không hỗ trợ:
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).
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 #:
+
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.
<@ 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!
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ượng và biế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.
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.
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