Ngôn ngữ sản xuất được sử dụng rộng rãi, tương thích nhất để xuất khẩu kiến ​​thức và kỹ năng thu được từ Haskell là gì?


14

Tôi thích Haskell, đơn giản và đơn giản. Mặc dù Haskell được sử dụng trong phần mềm sản xuất, nhưng nó không được triển khai rộng rãi từ những gì tôi đã thấy. Ngôn ngữ tương tự và vẫn được sử dụng rộng rãi nhất liên quan đến các dự án sản xuất là gì để tôi có thể có cơ hội sử dụng thứ gì đó tuyệt vời tương tự trong công nghiệp?

Cũng là ngôn ngữ tương tự từ phần đầu tiên có sẵn trên số lượng lớn các nền tảng? Nếu không, sự thay thế tốt nhất có triển khai nền tảng rộng là gì? Tôi muốn một ngôn ngữ duy nhất để đưa vào danh sách việc cần làm của tôi hơn là một bầy đàn hoặc gia đình đông đảo. Bằng chứng cứng sẽ là một cộng.

Câu trả lời:


21

Haskell có liên quan chặt chẽ nhất với họ ngôn ngữ ML. Điều này bao gồm những thứ như OCaml , tất nhiên, nhưng cũng có F # trên nền tảng .NET. Các ngôn ngữ này chia sẻ với Haskell nền tảng của hệ thống loại và cách sử dụng dữ liệu - các loại dữ liệu đại số, khớp mẫu, suy luận kiểu, v.v. , để bắt đầu, và sự phổ biến của Haskell như một phương tiện để nghiên cứu về các hệ thống loại và thiết kế ngôn ngữ có nghĩa là hầu hết các ngôn ngữ kiểu ML có xu hướng có các hệ thống loại ít mạnh hơn (nhưng có thể dễ hiểu hơn). Có thể an toàn để nói rằng trong khi bạn có thể bỏ lỡMột số điều về Haskell, đặc biệt là lúc đầu, hầu hết các lập trình viên Haskell có thể sẽ cảm thấy thoải mái khi ở nhà trong một ML khá nhanh, ở mức độ hoàn thành công việc cơ bản. Nếu bạn muốn một ngôn ngữ có cấu trúc tổng thể giống như Haskell, ML là lựa chọn tốt nhất của bạn.

Mặt chức năng của ScalaCũng rút ra rất nhiều từ truyền thống ML, và cũng có một số tính năng hệ thống tiên tiến quen thuộc từ Haskell, cũng như hệ thống OOP tiêu chuẩn hơn được tích hợp với phần trên. Trong khi OO trong các ngôn ngữ kiểu ML có xu hướng được tiếp cận như là một "mô hình OO với các công cụ chức năng cơ bản" Scala sống và hít thở OO kiểu Java. Điều này có lợi ích cho việc can thiệp Java, như bạn có thể tưởng tượng và thể hiện môi trường làm việc quen thuộc hơn cho các lập trình viên OO. Tuy nhiên, đến từ nền tảng Haskell, bạn sẽ khó chịu hơn bởi những cách pha trộn mọi thứ với nhau trong Scala làm cho các thành ngữ chức năng trở nên vụng về và thấy hầu hết các API Java được thiết kế tồi và khó sử dụng.

Cuối cùng, trong khi có vẻ kỳ lạ để xem xét, Clojure thực sự có rất nhiều điểm chung với Haskell ở cấp độ triết học hơn. Hầu hết những gì bạn sẽ tìm thấy trong cách tiếp cận trạng thái và giá trị của Clojure so với danh tính rất gần với những gì Haskell chính thức hóa thông qua hệ thống loại. Tương ứng, Clojure nhấn mạnh Java can thiệp ở mức độ nhỏ hơn và không lo lắng nhiều về việc kéo vào OOP, do đó, theo một số cách, cách tiếp cận của Clojure đối với lập trình chức năng có thể gần nhất với những gì bạn đã quen thuộc. Tôi nghĩ rằng nó nói về vấn đề này, theo hiểu biết tốt nhất của tôi, Clojure là ngôn ngữ duy nhất ngoài Haskell có triển khai STMđó là đơn giản, hiệu quả và chỉ hoạt động. Mặt khác, Clojure xuất phát từ truyền thống Lisp và do đó thiếu hệ thống kiểu tĩnh và nhấn mạnh vào các kiểu dữ liệu đại số và khớp mẫu được tìm thấy trong các ngôn ngữ chịu ảnh hưởng ML. Và tất nhiên đó là một Lisp, bản thân nó là một tiêu cực đối với một số người (mặc dù tôi thực sự không biết tại sao).

Nói về bản thân tôi, với sự từ chối rằng trải nghiệm đầu tiên của tôi về lập trình chức năng là ở Scheme, có lẽ tôi nghiêng về Clojure, với OCaml là sự lựa chọn thứ hai.


F # được cho là đã được truyền cảm hứng bởi, nếu không bắt nguồn từ, OCaml. Một câu hỏi SO trước đó, F # và OCaml , bao gồm một cuộc thảo luận tốt về mối quan hệ đó. Nếu bạn đứng về phía .NET, F # sẽ là một lựa chọn tuyệt vời và Microsoft hiện coi F # là ngôn ngữ .NET "hạng nhất". Về phía JVM, Scala có một hồ sơ theo dõi về sử dụng công nghiệp và Clojure dường như đang tăng lên trong bảng xếp hạng. Tôi không biết về bất kỳ lựa chọn tốt nhất nào, tại thời điểm này, vì thị trường chưa tuyên bố một người chiến thắng rõ ràng trong không gian chức năng đối tượng này.
John Tobler

4

Tôi không bao giờ sử dụng nó cho mình, nhưng đôi khi tôi thấy Scala xuất hiện trong các blog hoặc mô tả dự án và tôi tin rằng nó đã lấy các khái niệm chính từ Haskell. Scala biên dịch xuống JVM và có thể tương tác với Java.


3

Một thay thế chức năng là Erlang . Mặc dù nó là một ngôn ngữ rất đồng thời, tập hợp con tuần tự là một ngôn ngữ chức năng thuần túy với nhiều thuộc tính của các ngôn ngữ chức năng, ví dụ như các bao đóng, dữ liệu bất biến và khớp mẫu. Nó chạy trên nhiều nền tảng bao gồm linux, unixes, windows và macosx khác nhau. Bây giờ thậm chí còn có một triển khai trên JVM, erjang . Nó có thể dễ dàng giao tiếp và cùng tồn tại với các ngôn ngữ khác, đây là cách nó thường được sử dụng.

Kiểm tra trang web chính .


3

Clojure ngày càng được sử dụng rộng rãi, và mặc dù nó không giống Haskell ở mức độ hời hợt, nhưng nếu bạn nhìn sâu hơn một chút, rõ ràng nó được truyền cảm hứng rất nhiều bởi Haskell và khuyến khích một phong cách chức năng rất giống nhau.

Các tính năng chính của Clojure mà người dùng Haskell có thể thấy quen thuộc và hấp dẫn:

  • Ngôn ngữ cốt lõi hoàn toàn là chức năng - trong khi các tác dụng phụ có thể bị chôn vùi ở những nơi cụ thể (ví dụ: tham chiếu STM, hàm IO, khả năng tương tác Java)
  • Tất cả các cấu trúc dữ liệu là bất biến và liên tục
  • Sự lười biếng - đạt được phần lớn thông qua các chuỗi lười biếng phổ biến của Clojure, điều này sẽ cảm thấy rất quen thuộc với người dùng Haskell. Trình tự lười biếng vô hạn là tốt.
  • Bộ nhớ giao dịch phần mềm - là cách chính để xử lý trạng thái có thể thay đổi trong Clojure. Rất đáng xem video tuyệt vời này, nơi Rich Hickey giải thích cách tiếp cận của Clojure về danh tính và trạng thái: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Sự khác biệt chính (có thể là tích cực hoặc tiêu cực tùy thuộc vào quan điểm của bạn):

  • Điều đó không trong sạch - mặc dù quan sát của tôi là phong cách Clojure thành ngữ là gắn các chức năng thuần túy bất cứ nơi nào có thể.
  • Gõ động thay vì gõ tĩnh (mặc dù gợi ý kiểu tĩnh có thể được sử dụng tùy ý để tối ưu hóa hiệu suất)
  • Đó là một langau JVM với quyền truy cập dễ dàng vào toàn bộ hệ sinh thái thư viện Java - theo tôi đây là lợi thế lớn nhất về khả năng ứng dụng trong thế giới thực
  • Cú pháp Lisp. Vì vậy, bạn nhận được tất cả các lợi ích của đồng âm , với chi phí phải học để xem qua tất cả các dấu ngoặc đơn :-)

Quan điểm cá nhân: Tôi đã học Haskell trước Clojure và yêu Haskell vì sự thanh lịch và thuần khiết toán học. Clojure thu hút rất nhiều cảm hứng và mượn nhiều tính năng hay từ Haskell, nhưng là một ngôn ngữ thực dụng / thực tế hơn nhiều. Đặc biệt là khi bạn tính giá trị to lớn của việc có thể tận dụng hệ sinh thái thư viện Java thì đó là một ngôn ngữ tuyệt vời để "hoàn thành công việc".


1

Nếu bạn thích Haskell, nhưng phải tạo mã cho JVM, frege có thể thú vị với bạn. Nó được thiết kế gần nhất có thể với Haskell 2010, nhưng vẫn tạo mã Java.

Tất nhiên, bản thân frege không có gì giống như "ngôn ngữ sản xuất được sử dụng rộng rãi" (nó mới được xuất bản gần đây), nhưng Java thì chắc chắn.

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.