Học ngôn ngữ nào sau Haskell? [đóng cửa]


85

Là ngôn ngữ lập trình đầu tiên của tôi, tôi quyết định học Haskell. Tôi là một sinh viên chuyên ngành triết học phân tích và Haskell đã cho phép tôi tạo nhanh chóng và chính xác các chương trình mà tôi quan tâm, chẳng hạn như bộ chuyển đổi để phân tích ngôn ngữ tự nhiên, trình dò ​​định lý và thông dịch viên. Mặc dù tôi chỉ mới lập trình được hai tháng rưỡi, nhưng tôi thấy ngữ nghĩa và cú pháp của Haskell dễ học hơn nhiều so với các ngôn ngữ mệnh lệnh truyền thống, và cảm thấy thoải mái (hiện tại) với phần lớn cấu trúc của nó.

Tuy nhiên, lập trình trong Haskell giống như ma thuật, và tôi muốn mở rộng kiến ​​thức của mình về lập trình. Tôi muốn chọn một ngôn ngữ lập trình mới để học, nhưng tôi không có đủ thời gian để chọn một ngôn ngữ tùy ý, bỏ nó và lặp lại. Vì vậy, tôi nghĩ tôi sẽ đặt ra câu hỏi ở đây, cùng với một số quy định về loại ngôn ngữ mà tôi đang tìm kiếm. Một số là chủ quan, một số nhằm mục đích dễ dàng chuyển đổi từ Haskell.

  • Hệ thống loại mạnh. Một trong những phần yêu thích của tôi khi lập trình trong Haskell là viết khai báo kiểu. Điều này giúp cấu trúc suy nghĩ của tôi về các chức năng riêng lẻ và mối quan hệ của chúng với chương trình nói chung. Nó cũng giúp lập luận không chính thức về tính đúng đắn của chương trình của tôi dễ dàng hơn. Tôi quan tâm đến tính đúng đắn chứ không phải hiệu quả.
  • Nhấn mạnh vào đệ quy hơn là lặp. Tôi sử dụng các cấu trúc lặp trong Haskell, nhưng triển khai chúng một cách đệ quy. Tuy nhiên, việc hiểu cấu trúc của một hàm đệ quy sẽ dễ dàng hơn nhiều so với một thủ tục lặp lại phức tạp, đặc biệt là khi sử dụng tổ hợp và các hàm bậc cao như bản đồ, nếp gấp và liên kết.
  • Thưởng để học hỏi. Haskell là một ngôn ngữ bổ ích để làm việc. Nó hơi giống như đọc Kant. Tuy nhiên, kinh nghiệm của tôi vài năm trước với C thì không. Tôi không tìm C. Ngôn ngữ nên thực thi một mô hình thú vị về mặt khái niệm, mà theo ý kiến ​​hoàn toàn chủ quan của tôi, những người thích C thì không.

Cân nhắc câu trả lời : Tất nhiên đây chỉ là những ghi chú. Tôi chỉ muốn trả lời tất cả những ai đã đưa ra những câu trả lời hợp lý. Bạn đã được rất hữu ích.

1) Một số phản hồi chỉ ra rằng một ngôn ngữ được đánh máy tĩnh, mạnh mẽ nhấn mạnh đến đệ quy có nghĩa là một ngôn ngữ chức năng khác. Trong khi tôi muốn tiếp tục hợp tác mạnh mẽ với Haskell, camccann và larsmans đã chỉ ra một cách chính xác rằng một ngôn ngữ khác như vậy sẽ "dễ dàng chuyển đổi quá nhiều." Những nhận xét này rất hữu ích, bởi vì tôi không muốn viết Haskell bằng Caml! Trong số các trợ lý chứng minh, Coq và Agda đều trông thú vị. Đặc biệt, Coq sẽ cung cấp một giới thiệu vững chắc về logic xây dựng và lý thuyết kiểu hình thức. Tôi đã dành một ít thời gian với vị từ bậc nhất và logic phương thức (Mendellsohn, Enderton, một số Hinman), vì vậy tôi có thể sẽ rất vui với Coq.

2) Những người khác rất ưa chuộng Lisp (Common Lisp, Scheme và Clojure). Từ những gì tôi thu thập được, cả Common Lisp và Scheme đều có tài liệu giới thiệu tuyệt vời ( Trên LispThe Reasoned Schemer , SICP ). Tài liệu trong SICP khiến tôi nghiêng về Scheme. Cụ thể, Đề án thông qua SICP sẽ bao gồm một chiến lược đánh giá khác, việc thực hiện sự lười biếng và cơ hội tập trung vào các chủ đề như liên tục, phiên dịch, tính toán tượng trưng, ​​v.v. Cuối cùng, như những người khác đã chỉ ra, cách xử lý mã / dữ liệu của Lisp sẽ hoàn toàn mới. Do đó, tôi đang nghiêng nhiều về phương án (2), một Lisp.

3) Thứ ba, Prolog. Prolog có vô số tài liệu thú vị và miền chính của nó chính xác là miền mà tôi quan tâm. Nó có cú pháp đơn giản và dễ đọc. Tôi không thể bình luận thêm vào lúc này, nhưng sau khi đọc tổng quan về Prolog và đọc lướt một số tài liệu giới thiệu, nó xếp hạng với (2). Và có vẻ như sự cố gắng của Prolog luôn bị hack vào Haskell!

4) Trong số các ngôn ngữ chính, Python có vẻ thú vị nhất. Tim Yates làm cho các ngôn ngữ nghe rất hấp dẫn. Rõ ràng, Python thường được dạy cho các sinh viên chuyên ngành CS năm nhất; vì vậy nó phong phú về mặt khái niệm hoặc dễ học. Tôi sẽ phải nghiên cứu thêm.

Cảm ơn tất cả các đề xuất của bạn! Có vẻ như Lisp (Scheme, Clojure), Prolog hoặc một trợ lý bằng chứng như Coq hoặc Agda là những ngôn ngữ chính được khuyến nghị.


34
2,5 tháng là thời gian không đủ để học chuyên sâu bất kỳ ngôn ngữ nào, xin lỗi bạn đã vỡ bong bóng.
Woot4Moo

20
Điều đó chắc chắn đúng. Tôi không có ý ám chỉ rằng tôi đã "học" Haskell, bất kể điều đó có nghĩa là gì. Ý tôi là tôi cảm thấy thoải mái khi sử dụng ngôn ngữ này. Tôi rõ ràng sẽ không "ngừng học hỏi" nó.
danportin

10
@ Michael: Coding cho đúng đắn thay vì hiệu quả là điều mà tôi rất muốn xem chi tiết của ...
Deniz Dogan

24
@ Woot4Moo: Tuy nhiên, 2,5 tháng là rất nhiều thời gian để bạn "thoải mái" với một ngôn ngữ. Đúng như vậy gấp đôi nếu anh ấy quen thuộc với logic hình thức và làm việc với các khái niệm trừu tượng từ nền tảng triết học của mình. Không phải bỏ thói quen học từ các ngôn ngữ khác cũng sẽ hữu ích trong trường hợp này.
CA McCann

8
@gnovice: Nó đã được hỏi rất nhiều lần, chắc chắn. Nhưng đây là lần đầu tiên tôi gặp một người đã thực hiện trải nghiệm lập trình nghiêm túc đầu tiên của mình với Haskell. Nó giống như mũi tên thời gian đã bị đảo ngược hay sao đó.
Muhammad Alkarouri

Câu trả lời:


85

Tôi muốn mở rộng kiến ​​thức của mình về lập trình. (...) Tôi nghĩ tôi sẽ đặt câu hỏi ở đây, cùng với một số quy định về loại ngôn ngữ tôi đang tìm kiếm. Một số là chủ quan, một số nhằm mục đích dễ dàng chuyển đổi từ Haskell.

Hệ thống loại mạnh. (...) Nó cũng giúp lập luận không chính thức về tính đúng đắn của chương trình của tôi dễ dàng hơn. Tôi quan tâm đến tính đúng đắn chứ không phải hiệu quả.

Nhấn mạnh vào đệ quy hơn là lặp. (...)

Tôi e rằng bạn có thể đang nới lỏng quá trình chuyển đổi một chút ở đây. Hệ thống kiểu rất nghiêm ngặt và kiểu chức năng thuần túy là đặc điểm của Haskell và hầu như bất cứ thứ gì tương tự như một ngôn ngữ lập trình chính thống sẽ đòi hỏi phải thỏa hiệp ít nhất một phần nào đó trên một trong số này. Vì vậy, với suy nghĩ đó, đây là một vài gợi ý chung nhằm giữ lại hầu hết những gì bạn có vẻ thích về Haskell, nhưng với một số thay đổi lớn.

  • Bỏ qua tính thực tế và đi tìm "nhiều Haskell hơn Haskell" : Hệ thống kiểu Haskell đầy lỗ hổng, do sự đề cử và các thỏa hiệp lộn xộn khác. Dọn dẹp mớ hỗn độn và thêm các tính năng mạnh mẽ hơn và bạn sẽ nhận được các ngôn ngữ như CoqAgda , trong đó kiểu của một hàm chứa bằng chứng về tính đúng đắn của nó (thậm chí bạn có thể đọc mũi tên hàm ->như hàm ý logic!). Những ngôn ngữ này đã được sử dụng để chứng minh toán học và cho các chương trình có yêu cầu về độ chính xác cực kỳ cao. Coq có lẽ là ngôn ngữ nổi bật nhất của phong cách này, nhưng Agda có cảm giác Haskell-y hơn (cũng như được viết bằng chính Haskell).

  • Bỏ qua các loại, thêm nhiều ma thuật : Nếu Haskell là ma thuật thì Lisp là ma thuật thô sơ, nguyên thủy của tạo hóa. Các ngôn ngữ Lisp-family (bao gồm cả SchemeClojure ) có tính linh hoạt gần như vô song kết hợp với sự tối giản cực độ. Các ngôn ngữ về cơ bản không có cú pháp, viết mã trực tiếp dưới dạng cấu trúc dữ liệu cây; lập trình siêu chương trình trong Lisp dễ hơn lập trình không phải meta trong một số ngôn ngữ.

  • Thỏa hiệp một chút và tiến gần hơn đến xu hướng chính : Haskell rơi vào nhóm ngôn ngữ rộng lớn bị ảnh hưởng bởi ML, bất kỳ ngôn ngữ nào trong số đó bạn có thể chuyển sang mà không gặp quá nhiều khó khăn. Haskell là một trong những công ty nghiêm ngặt nhất khi nói đến đảm bảo tính đúng đắn từ các loại và sử dụng phong cách chức năng, trong đó những người khác thường là phong cách lai ghép và / hoặc thực hiện các thỏa hiệp thực dụng vì nhiều lý do. Nếu bạn muốn tiếp xúc với OOP và tiếp cận với nhiều nền tảng công nghệ chính thống, hãy Scala trên JVM hoặc F #trên .NET có nhiều điểm chung với Haskell trong khi cung cấp khả năng tương tác dễ dàng với các nền tảng Java và .NET. F # được hỗ trợ trực tiếp bởi Microsoft, nhưng có một số hạn chế khó chịu so với Haskell và các vấn đề về tính di động trên các nền tảng không phải Windows. Scala có các đối tác trực tiếp với nhiều loại hệ thống của Haskell và tiềm năng đa nền tảng của Java, nhưng có cú pháp nặng nề hơn và thiếu sự hỗ trợ mạnh mẽ của bên thứ nhất mà F # thích.

Hầu hết các khuyến nghị đó cũng được đề cập trong các câu trả lời khác, nhưng hy vọng lý do tôi đưa ra cho chúng sẽ cung cấp một số khai sáng.


4
Tôi gia đình CoqAgda, bạn cũng có thể nhìn vào Qi II .
Hynek -Pichi- Vychodil

Theo bạn, những hạn chế khó chịu của F # sẽ là gì? Là một người học F # trong thời gian rảnh rỗi, tôi rất tò mò muốn biết.
Lucas

7
@Lucas: Haskell lớn so với Haskell xương trần là thiếu các lớp kiểu và đa hình cao cấp hơn. Ngoài ra, một số tiện ích mở rộng dành riêng cho GHC khá hay. Đó không phải là một lỗ hổng chết người, nhưng sau khi quen với Haskell, nó chỉ cảm thấy hơi vụng về khi không có những thứ đó. Hãy tưởng tượng đi từ C # hiện đại trở lại sử dụng C # 1.x ...
CA McCann

@HyneK: Ngôn ngữ Qi 2 này thoạt nhìn có vẻ rất thú vị và linh hoạt hơn cả Coq hay Adga. Có vẻ như tác giả đã quyết định gọi nó là bỏ cuộc. Có bất kỳ phong trào nào để tiếp tục làm việc trên ngôn ngữ này không? Tôi không muốn học một thứ gì đó đã quá nửa vời.
Alex

@Alex: có vẻ như nó được tiếp tục với tên Shen: shenlanguage.org
amindfv

20

Tôi sẽ trở thành Chàng trai đó và gợi ý rằng bạn đang yêu cầu sai.

Đầu tiên, bạn nói rằng bạn muốn mở rộng tầm nhìn của mình. Sau đó, bạn mô tả loại ngôn ngữ mà bạn muốn, và các chân trời của nó nghe giống như những chân trời bạn đã có. Bạn sẽ không thu được nhiều bằng cách học đi học lại cùng một thứ.

Tôi khuyên bạn nên học một Lisp - tức là Common Lisp, Scheme / Racket hoặc Clojure. Tất cả chúng đều được nhập động theo mặc định, nhưng có một số kiểu gợi ý kiểu hoặc nhập tĩnh tùy chọn. Racket và Clojure có lẽ là loại cược tốt nhất của bạn.

Clojure gần đây hơn và có nhiều Haskellisms hơn như tính bất biến theo mặc định và nhiều đánh giá lười biếng, nhưng nó dựa trên Máy ảo Java, có nghĩa là nó có một số mụn cóc kỳ lạ (ví dụ: JVM không hỗ trợ loại bỏ cuộc gọi đuôi, vì vậy đệ quy là loại tốt của một vụ hack).

Racket cũ hơn nhiều, nhưng đã thu được rất nhiều sức mạnh, chẳng hạn như hỗ trợ kiểu tĩnh và tập trung vào lập trình chức năng. Tôi nghĩ bạn có thể tận dụng tối đa Racket.

Hệ thống macro trong Lisps rất thú vị và mạnh mẽ hơn bất cứ thứ gì bạn sẽ thấy ở bất kỳ nơi nào khác. Điều đó một mình ít nhất là đáng để xem xét.


3
Heh, từ góc độ Haskell, kiểu gõ gợi ý hoặc kiểu gõ tĩnh tùy chọn không thực sự khác biệt với kiểu gõ động hoàn toàn. Đó là một suy nghĩ rất khác. Điều đó nói rằng, ngôn ngữ Lisp-y là tất cả các loại thú vị và là điều mà tôi nghĩ mọi lập trình viên nên dành ít nhất một thời gian để học.
CA McCann

19

Từ quan điểm của những gì phù hợp với chuyên ngành của bạn, lựa chọn hiển nhiên có vẻ giống như một ngôn ngữ logic chẳng hạn như Prolog hoặc các dẫn xuất của nó. Lập trình logic có thể được thực hiện rất gọn gàng bằng một ngôn ngữ chức năng (xem, ví dụ: The Reasoned Schemer ), nhưng bạn có thể thích làm việc trực tiếp với mô hình logic.

Một hệ thống chứng minh định lý tương tác chẳng hạn như 12 hoặc coq cũng có thể khiến bạn thích thú.


2
Khi bạn thể hiện sự quan tâm đến một ngôn ngữ được đánh máy mạnh, tôi khuyên bạn nên sử dụng lambdaProlog, một ngôn ngữ lập trình logic bậc cao được nhập. Một triển khai đã biên dịch là Teyjus - code.google.com/p/teyjus (tiết lộ: Tôi đã làm việc trên Teyjus).
Zach Snow

18

Tôi khuyên bạn nên học Coq , đây là một trợ lý chứng minh mạnh mẽ với cú pháp mà lập trình viên Haskell sẽ cảm thấy thoải mái. Điều thú vị về Coq là nó có thể được trích xuất sang các ngôn ngữ chức năng khác, bao gồm cả Haskell. Thậm chí có một gói ( Meldable-Heap ) trên Hackage được viết bằng Coq, có các thuộc tính được chứng minh về hoạt động của nó, sau đó được trích xuất sang Haskell.

Một ngôn ngữ phổ biến khác cung cấp nhiều sức mạnh hơn Haskell là Agda - Tôi không biết Agda ngoài việc biết rằng nó được gõ phụ thuộc, trên Hackage và được những người tôi tôn trọng, nhưng đó là những lý do đủ tốt đối với tôi.

Tôi sẽ không mong đợi một trong hai điều này là dễ dàng. Nhưng nếu bạn biết Haskell và muốn chuyển sang một ngôn ngữ mang lại nhiều sức mạnh hơn hệ thống kiểu Haskell thì chúng nên được xem xét.


1
Agda nghe có vẻ giống như "bước tiếp theo" tự nhiên từ Haskell.
Deniz Dogan

5
Cũng cần lưu ý rằng, với tư cách là một sinh viên chuyên ngành triết học, anh ta có nhiều kinh nghiệm về logic hình thức, thì các trợ lý chứng minh kiểu Curry-Howard có thể sẽ ít gây khó khăn cho anh ta hơn so với hầu hết các lập trình viên kỳ cựu!
CA McCann

11

Vì bạn không đề cập đến bất kỳ hạn chế nào ngoài sở thích chủ quan của mình và nhấn mạnh 'phần thưởng để học' (tốt, được, tôi sẽ bỏ qua hạn chế nhập tĩnh), tôi khuyên bạn nên học một vài ngôn ngữ của các mô hình khác nhau và tốt nhất là những ngôn ngữ là 'gương mẫu' cho mỗi người trong số họ.

  • Một phương ngữ Lisp cho thứ mã dưới dạng dữ liệu / tính đồng nhất và vì chúng tốt, nếu không muốn nói là tốt nhất, ví dụ về ngôn ngữ lập trình chức năng động (ít nhiều nghiêm ngặt)
  • Prolog là ngôn ngữ lập trình logic chiếm ưu thế
  • Smalltalk như một ngôn ngữ OOP thực sự (cũng thú vị vì cách tiếp cận thường cực kỳ tập trung vào hình ảnh)
  • có thể là Erlang hoặc Clojure nếu bạn quan tâm đến các ngôn ngữ được rèn cho lập trình đồng thời / song song / phân tán
  • Forth cho lập trình hướng ngăn xếp
  • ( Haskell cho lập trình lười biếng được gõ tĩnh có chức năng nghiêm ngặt)

Đặc biệt là Lisps (CL không nhiều như Scheme) và Prolog (và Haskell) bao gồm đệ quy.

Mặc dù tôi không phải là chuyên gia về bất kỳ ngôn ngữ nào trong số này, nhưng tôi đã dành một chút thời gian cho từng ngôn ngữ đó, ngoại trừ Erlang và Forth, và tất cả chúng đều cho tôi những trải nghiệm học tập thú vị và mở mang tầm mắt, khi mỗi người tiếp cận giải quyết vấn đề từ một góc độ khác .

Vì vậy, mặc dù có vẻ như tôi đã bỏ qua phần về việc bạn không có thời gian để thử một vài ngôn ngữ, nhưng tôi nghĩ rằng thời gian dành cho bất kỳ ngôn ngữ nào trong số này sẽ không bị lãng phí, và bạn nên xem xét tất cả chúng.


Tôi không thể chịu được những hạn chế của Erlang liên quan đến người giám hộ;)
gorsky vào

10

Làm thế nào về một ngôn ngữ lập trình hướng ngăn xếp ? Cat đánh điểm cao của bạn. Nó là:

  • Được nhập tĩnh với kiểu suy luận.
  • Làm cho bạn nghĩ lại các khái niệm ngôn ngữ mệnh lệnh phổ biến như lặp lại. Thực thi có điều kiện và lặp lại được xử lý bằng các tổ hợp .
  • Phần thưởng - buộc bạn phải hiểu thêm một mô hình tính toán khác. Cung cấp cho bạn một cách khác để suy nghĩ và giải quyết vấn đề.

Tiến sĩ Dobbs đã xuất bản một bài báo ngắn về Cat vào năm 2008 mặc dù ngôn ngữ đã thay đổi một chút.


10

Nếu bạn muốn có một Prolog được đánh máy mạnh mẽ, Mercury là một lựa chọn thú vị. Tôi đã từng thử qua nó trong quá khứ và tôi thích góc nhìn khác biệt mà nó mang lại cho tôi. Nó cũng có moded-ness (những tham số nào cần phải tự do / cố định) và thuyết xác định (có bao nhiêu kết quả?) Trong hệ thống kiểu.

Clean rất giống với Haskell, nhưng có tính năng gõ duy nhất, được sử dụng thay thế cho Monads (cụ thể hơn là đơn nguyên IO). Tính năng gõ duy nhất cũng mang lại những điều thú vị khi làm việc với các mảng.



8

Mặc dù nó không đáp ứng được một trong những tiêu chí lớn của bạn (kiểu gõ tĩnh *), tôi sẽ đưa ra một trường hợp cho Python. Dưới đây là một vài lý do tôi nghĩ bạn nên xem qua:

  • Đối với một ngôn ngữ mệnh lệnh, nó có chức năng đáng ngạc nhiên. Đây là một trong những điều khiến tôi kinh ngạc khi tôi học được nó. Lấy ví dụ về hiểu danh sách . Nó có lambdas, chức năng hạng nhất và nhiều tác phẩm lấy cảm hứng từ chức năng trên các trình vòng lặp (bản đồ, nếp gấp, khóa kéo ...). Nó cung cấp cho bạn tùy chọn chọn bất kỳ mô hình nào phù hợp với vấn đề nhất.
  • Giống như Haskell, IMHO rất đẹp khi viết mã. Cú pháp đơn giản và tao nhã.
  • Nó có một nền văn hóa tập trung vào việc làm mọi thứ một cách đơn giản, thay vì tập trung quá nhỏ vào hiệu quả.

Tôi hiểu nếu bạn đang tìm kiếm thứ gì khác. Ví dụ, lập trình logic có thể phù hợp với con hẻm của bạn, như những người khác đã đề xuất.


* Tôi giả sử bạn muốn nhập tĩnh ở đây, vì bạn muốn khai báo các kiểu. Về mặt kỹ năng, Python một ngôn ngữ được đánh máy mạnh, vì bạn không thể tùy tiện diễn giải một chuỗi dưới dạng một số. Điều thú vị là có các dẫn xuất Python cho phép nhập tĩnh, như Boo .


Mặc dù vậy, hệ thống loại mạnh không nhất thiết chỉ có nghĩa là nhập "tĩnh".
Deniz Dogan

+1 cũng xem nhận xét của tôi về câu trả lời của larsmans. Nhưng hãy cẩn thận khi quảng cáo Python là khá chức năng. Ví dụ, biểu thức trình tạo thường được ưu tiên hơn map, filterv.v. Tuy nhiên, trình tạo và biểu thức trình tạo sẽ cảm thấy quen thuộc với những người biết đánh giá lười biếng và các chức năng đã nói.

16
Có thật không? Tôi nghĩ rằng Python có vẻ đặc biệt hữu ích đối với những người chưa thực hiện nhiều lập trình chức năng. Tôi đã sử dụng cả Python và Haskell rất nhiều, và mặc dù Python là một ngôn ngữ tốt, và chắc chắn đã vay mượn một vài thứ từ các ngôn ngữ chức năng, nhưng nó vẫn là bắt buộc 99%.
CA McCann

@camccann Bạn nói đúng - quan điểm của tôi khác, đó là lý do tại sao tôi chỉ cung cấp điều này như một sự thay thế thú vị. Là một người đã học lập trình mệnh lệnh trước tiên, tôi đánh giá cao rằng Python cho phép tôi sử dụng các kỹ thuật chức năng khi chúng phù hợp và tránh chúng ở những nơi có ý nghĩa khác. Tôi không đưa ra trường hợp rằng nó "hoạt động" - chỉ là nó tạo ra một thỏa hiệp tốt.
Tim Yates

Những thói quen học được từ Haskell có thể khiến bạn trở thành một lập trình viên Python tốt hơn nhiều so với những người khác đã học nó như ngôn ngữ đầu tiên.
u0b34a0f6ae

8

Tôi muốn giới thiệu bạn Erlang. Nó không phải là ngôn ngữ được đánh máy mạnh và bạn nên thử nó. Đó là cách tiếp cận rất khác đối với lập trình và bạn có thể thấy rằng có những vấn đề trong đó gõ mạnh không phải là Công cụ tốt nhất (TM). Dù sao thì Erlang cũng cung cấp cho bạn các công cụ để xác minh kiểu tĩnh (typer, dialyzer) và bạn có thể sử dụng cách gõ mạnh vào những phần mà bạn có được lợi ích từ nó. Đó có thể là trải nghiệm thú vị đối với bạn nhưng hãy chuẩn bị tinh thần, đó sẽ là cảm giác rất khác. Nếu bạn đang tìm kiếm "mô hình thú vị về mặt khái niệm", bạn có thể tìm thấy chúng trong Erlang, truyền thông báo, tách bộ nhớ thay vì chia sẻ, phân phối, OTP, xử lý lỗi và truyền lỗi thay vì "ngăn chặn" lỗi, v.v. Erlang có thể khác xa với trải nghiệm hiện tại của bạn nhưng vẫn cảm thấy nhức nhối nếu bạn có kinh nghiệm với C và Haskell.


8

Với mô tả của bạn, tôi sẽ đề xuất Ocaml hoặc F # .

Họ ML nói chung là rất tốt về một hệ thống loại mạnh. Sự nhấn mạnh vào đệ quy, cùng với việc so khớp mẫu, cũng rõ ràng.

Nơi tôi có một chút do dự là phần học bổ ích . Không nghi ngờ gì nữa, việc học chúng là phần thưởng đối với tôi. Nhưng với những hạn chế của bạn và mô tả của bạn về những gì bạn muốn, có vẻ như bạn không thực sự tìm kiếm thứ gì đó khác nhiều hơn Haskell.

Nếu bạn không đưa ra các hạn chế của mình, tôi sẽ đề xuất Python hoặc Erlang , cả hai đều sẽ đưa bạn ra khỏi vùng an toàn của mình.


6

Theo kinh nghiệm của tôi, gõ mạnh + nhấn mạnh vào đệ quy có nghĩa là một ngôn ngữ lập trình chức năng khác. Sau đó, một lần nữa, tôi tự hỏi liệu điều đó có rất bổ ích không, vì không ai trong số họ sẽ "tinh khiết" như Haskell.

Như các áp phích khác đã gợi ý, Prolog và Lisp / Scheme rất hay, mặc dù cả hai đều được nhập động. Nhiều cuốn sách tuyệt vời với “hương vị” lý thuyết mạnh mẽ đối với họ đã được xuất bản về Đề án nói riêng. Hãy nhìn vào SICP , nó cũng truyền đạt rất nhiều kiến ​​thức về khoa học máy tính nói chung (trình thông dịch siêu vòng tròn và những thứ tương tự).


4
+1 cho đoạn đầu tiên, chính xác những gì tôi nghĩ khi đọc câu hỏi. Vì lợi ích của việc học những điều mới, tôi sẽ đề xuất một ngôn ngữ mệnh lệnh hiện đại, như Python - đặc biệt là vì nó không phải là ngôn ngữ OP quen dùng (nhập động, trình vòng lặp ở khắp mọi nơi, v.v.). Nó cũng có các khái niệm nâng cao rất thú vị như kính đo hoặc trình tạo (tương tự như danh sách lười biếng) / biểu thức trình tạo (đóng vai trò là sự tổng quát của các trình hiểu danh sách + trình tạo). Ngoài ra, đọc chính tả và thiết lập quy tắc hiểu.

3
@delnan: Haskell cũng có khả năng hiểu danh sách và trình tạo / trình vòng lặp có thể dễ dàng được thể hiện trong Haskell bằng cách sử dụng kiểu danh sách chuẩn của Haskell. Vì vậy, sự khác biệt lớn nhất giữa hai ngôn ngữ theo quan điểm của tôi là lập trình hướng đối tượng và (thường là) cấu trúc dữ liệu không tinh khiết như từ điển.
Deniz Dogan

1
@Deniz Dogan: đừng quên việc thiếu các khai báo và phạm vi từ vựng thích hợp trong Python.
Fred Foo


5

Bạn có thể bắt đầu xem xét Lisp .

Prolog cũng là một ngôn ngữ tuyệt vời.


5

Nếu bạn quyết định không thích hệ thống kiểu, bạn có thể quan tâm đến ngôn ngữ lập trình J. Nó nổi bật về cách nó nhấn mạnh thành phần chức năng. Nếu bạn thích phong cách không tính điểm trong Haskell, hình thức ngầm của J sẽ rất hữu ích. Tôi thấy nó cực kỳ kích thích tư duy, đặc biệt là về ngữ nghĩa.

Đúng, nó không phù hợp với định kiến ​​của bạn về những gì bạn muốn, nhưng hãy xem nó. Chỉ cần biết rằng nó ở ngoài kia rất đáng để khám phá. Nguồn duy nhất của việc triển khai hoàn chỉnh là J Software, jsoftware.com.


0

Đi với một trong những luồng chính. Với các tài nguyên có sẵn, khả năng tiếp thị trong tương lai của kỹ năng của bạn, hệ sinh thái nhà phát triển phong phú, tôi nghĩ bạn nên bắt đầu với Java hoặc C # .


14
So với Haskell, cả hai đều là ngôn ngữ IMO khá khập khiễng .
missfaktor

9
Yêu cầu một Haskeller chuyển đến Java cũng giống như yêu cầu Bill Gates chuyển đến các khu ổ chuột. : - /
missfaktor 22/09/10

1
+1 Vì đề xuất điều gì đó chắc chắn sẽ khiến bạn bị phản đối. Java và C # có hệ sinh thái tốt và đều rất được khuyến khích cho những công việc nghiêm túc. Một điểm cộng chắc chắn là bạn có thể tận dụng kiến ​​thức của mình về Haskell (, Java và C #) khi sử dụng Clojure trên JVM hoặc F # trên CLR.
ponzao

6
@ponzao: Urgh, không, gợi ý rằng ai đó chuyển từ Haskell sang Java hoặc C # thật kinh khủng và tàn nhẫn. Scala, F # và Clojure là những ngôn ngữ đẹp hơn nhiều với tất cả các lợi ích giống nhau khi chạy trên JVM / CLR.
CA McCann

5
Đối với triết học phân tích, Java hoặc C # chính là một sự lãng phí thời gian.
MaD70

0

Câu hỏi tuyệt vời-- Tôi đã tự hỏi nó gần đây sau khi dành vài tháng để thưởng thức Haskell một cách triệt để, mặc dù nền tảng của tôi rất khác (hóa học hữu cơ).

Giống như bạn, C và ilk của nó không phải là câu hỏi.

Tôi đã dao động giữa Python và Ruby là hai ngôn ngữ kịch bản workhorse thực tế ngày nay (mules?) Mà cả hai đều có một số thành phần chức năng để giúp tôi hài lòng. Không bắt đầu bất kỳ cuộc tranh luận nào về Rubyist / Pythonist ở đây, nhưng câu trả lời thực dụng của cá nhân tôi cho câu hỏi này là:

Tìm hiểu một (Python hoặc Ruby) mà trước tiên bạn có cớ để áp dụng.

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.