Tôi khuyên bạn nên pure-lang cho các kết thúc sư phạm này. Nó cũng rất mạnh mẽ. Nếu bạn muốn một cái gì đó phổ biến hơn/với sự hỗ trợ cộng đồng nhiều hơn, thì tôi khuyên bạn nên sử dụng Scheme hoặc OCaml, tùy thuộc vào việc bạn muốn xử lý cú pháp lạ (đi với Scheme) hay xử lý gõ không quen thuộc (đi với OCaml) trước. SML và F # chỉ hơi khác với OCaml. Những người khác có hoặc sẽ đề cập đến Clojure, Scala, và Haskell.
Clojure là một biến thể của Đề án, với các idiosyncracies riêng của nó (ví dụ: không có tối ưu hóa cuộc gọi đuôi), do đó, sử dụng nó sẽ là một cách để bắt đầu với Đề án. Tôi hy vọng bạn sẽ có một thời gian dễ dàng hơn với một thực hiện Scheme ít phong cách riêng mặc dù. Racket là những gì thường được sử dụng để giảng dạy. Scala trông giống về cơ bản giống với OCaml, nhưng điều này chỉ dựa trên sự quen thuộc thông thường.
Không giống như Haskell, các ngôn ngữ khác được đề cập đều có hai ưu điểm: (1) thứ tự đánh giá là háo hức theo mặc định, mặc dù bạn có thể nhận được đánh giá lười biếng bằng cách yêu cầu cụ thể. Trong Haskell thì ngược lại. (2) Sự đột biến có sẵn, mặc dù nhiều thư viện và mã bạn sẽ thấy không sử dụng nó. Tôi thực sự nghĩ rằng nó tốt hơn về mặt sư phạm để học lập trình hàm trong khi đồng thời chú ý đến cách nó tương tác với các tác dụng phụ, và làm việc theo cách của bạn để tạo thành phong cách monadic xuống đường. Vì vậy, tôi nghĩ rằng đây là một lợi thế. Một số sẽ cho bạn biết rằng tốt hơn là nên ném vào cách xử lý mutaton cách ly của Haskell lần đầu tiên, mặc dù vậy.
Robert Harper tại CMU has some nice blog posts on teaching functional programming. Theo tôi hiểu, anh ấy cũng thích các ngôn ngữ như OCaml để giảng dạy.
Trong số ba loại ngôn ngữ tôi đã đề xuất (Pure, Scheme và bạn bè, OCaml và bạn bè), hai loại đầu tiên có tính năng nhập động. Thứ nhất và thứ ba có các ô tham chiếu rõ ràng (như trong Python, bạn tự giới hạn mình không bao giờ tái định hướng một biến nhưng bạn vẫn có thể thay đổi những gì được lưu trữ trong một chỉ mục danh sách). Lược đồ có các ô tham chiếu ngầm định: các biến tự nhìn giống nhau, như trong C và Python, và việc xử lý ô tham chiếu được thực hiện bên dưới các lớp. Trong các ngôn ngữ như vậy, bạn thường có một số dạng tham chiếu rõ ràng có sẵn (như trong ví dụ tôi đã đưa ra bằng Python, hoặc sử dụng cặp/danh sách có thể thay đổi trong Racket ... trong các lược đồ khác, bao gồm tiêu chuẩn Đề án, đó là cặp/danh sách mặc định).
Một đức tính mà Haskell có là một số sách giáo khoa đang xuất hiện cho nó. (Tôi có ý nói điều này một cách chân thành, chứ không phải một cách khinh bỉ.) Sách/tài nguyên nào để sử dụng là một vấn đề gây tranh cãi khác với nhiều cuộc chiến/câu hỏi kín. SICP như những người khác đã đề nghị có nhiều người hâm mộ và cũng có một số nhà phê bình. Dường như tôi có nhiều lựa chọn tốt. Tôi sẽ không mạo hiểm hơn nữa vào những cuộc tranh luận đó.
Haskell thường được khuyến cáo để tìm hiểu mô hình chức năng vì nó là tinh khiết. Nó không phải là dễ dàng, nhưng có lẽ bạn có thể bị nhầm lẫn bằng cách trộn mô hình thủ tục và chức năng trong các ngôn ngữ khác (Scala và những người khác). – MatijaSh