2012-07-13 43 views
6

Tôi muốn học một ngôn ngữ chức năng để mở rộng chân trời của mình. Tôi có kiến ​​thức về Python và C/C++ và tôi muốn một ngôn ngữ để dễ dàng học hỏi từ một người đến từ miền bắt buộc của ngôn ngữ. Tôi không quan tâm liệu ngôn ngữ đó có đủ mạnh không. Tôi chỉ muốn một ngôn ngữ để tìm hiểu cơ bản của lập trình hàm và sau đó tôi sẽ cố gắng cho một ngôn ngữ khó hơn (và mạnh mẽ).Ngôn ngữ lập trình chức năng đơn giản nhất cho ai có nền trong ngôn ngữ mệnh lệnh?

Cảm ơn

+3

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

Trả lời

8

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 đó.

1

Câu hỏi này có lẽ là off-topic vì nó sẽ dẫn đến cuộc chiến tranh ngôn ngữ vô tận, nhưng đây là một chút chung của lời khuyên:

Có một lớp học ngôn ngữ lập trình chức năng mà đôi khi được gọi là "chủ yếu là chức năng" , trong đó họ cho phép một số tính năng bắt buộc mà bạn muốn chúng. Ví dụ bao gồm Standard ML, OCaml, F # và Scala. Bạn có thể xem xét một trong những điều này nếu bạn muốn có thể nắm bắt được phong cách thành ngữ chức năng trong khi vẫn có thể đạt được những thứ theo những cách khá quen thuộc.

Tôi đã sử dụng Standard ML rộng rãi trong quá khứ, nhưng nếu bạn đang tìm kiếm thứ gì đó ít hơn một đường cong học tập, tôi khuyên bạn nên Scala, ngôn ngữ lập trình yêu thích thứ hai của tôi. Những lý do cho điều này bao gồm sự phổ biến của thư viện, một cộng đồng có kích thước khỏe mạnh và sự sẵn có của các cuốn sách hay hướng dẫn tốt để giúp bạn bắt đầu (đặc biệt nếu bạn đã từng có giao dịch với Java).

+1

Tôi tự hỏi liệu khả năng dự phòng theo phong cách bắt buộc khi bạn muốn có thể trở thành một trở ngại cho việc học phong cách chức năng. – Thilo

+0

Câu hỏi đặt ra là "dễ học nhất", vì vậy trong khi tôi đồng ý rằng có một dự phòng bắt buộc có thể không phải là chiến lược dài hạn tốt nhất, nó sẽ giảm đường cong học tập sao cho bạn không phải học cách IO hoạt động trong một khung cảnh thuần khiết cùng lúc với mọi thứ khác :) – Gian

+0

Vâng, tôi hy vọng câu hỏi này sẽ sớm được đóng lại. – dubiousjim

4

Lúc đầu, hãy đọc Cấu trúc và triển khai chương trình máy tính. Tôi khuyên bạn nên Lisp (ví dụ, nó là phương ngữ của phương ngữ) là ngôn ngữ lập trình hàm đầu tiên.

+0

Tôi đồng ý với đề xuất của bạn. Bản thân tôi đã được hưởng lợi rất nhiều từ SICP và tập công.Tôi cũng sẽ khuyên bạn nên nghiên cứu SICP. – weima

+0

Có thể tên sách là _Cấu trúc và diễn giải các chương trình máy tính_ – ibubi

2

Một tùy chọn khác là Clojure, tôi được hiểu là có chức năng "thuần túy" hơn Scheme/Racket (không hỏi tôi về chi tiết ở đây) và có thể đủ tương tự để bạn sử dụng nó cùng với SICP (Cấu trúc và giải thích các chương trình máy tính, một cuốn sách rất khuyến khích cũng được đề xuất bởi một câu trả lời khác).

1

Một yếu tố không được thảo luận là có sẵn cú pháp mẫu phù hợp đặc biệt cho các kiểu dữ liệu đại số, như trong Haskell, tất cả các hương vị của ML và có thể một số ngôn ngữ khác được đề cập. Cú pháp khớp mẫu có xu hướng giúp lập trình viên thấy chức năng của chúng là hàm toán học. Cú pháp của Haskell là đủ phức tạp, và các triển khai của nó có các thông báo lỗi phân tích cú pháp đủ nghèo nàn, cú pháp đó là một lý do hợp lý để không chọn Haskell. Sơ đồ có lẽ dễ học hơn hầu hết các tùy chọn khác (và Scheme có thể là vua của tất cả các hệ thống macro), nhưng thiếu cú ​​pháp khớp mẫu sẽ đẩy tôi ra khỏi nó để giới thiệu về lập trình hàm.

+1

Tôi hoàn toàn đồng ý về tầm quan trọng của việc khớp mẫu trong học lập trình chức năng. Tôi nghĩ rằng nó sẽ có sẵn với nhiều hơn hoặc ít hơn làm việc trên hầu hết hoặc tất cả các lựa chọn mặc dù. Nhiều triển khai Đề án có mẫu khớp với ít nhất là phần mở rộng; Racket có nó nguyên bản. Một phiên bản thực hiện bất khả tri được phân phối với sách giáo khoa Yếu tố cần thiết của Ngôn ngữ lập trình. Bởi tất cả có nghĩa là ai đó học FP với Đề án nên chắc chắn khai thác các cơ sở này. – dubiousjim

+1

Hồi ức của tôi là cú pháp cho đối sánh mẫu trong Racket ít nhiều có thể đọc và ghi được hơn cú pháp để thực hiện trong ML. Tôi có bối rối không? Thực tế là Racket không có các kiểu dữ liệu đại số (mặc dù ngôn ngữ con PLAI thực hiện một công việc rất tốt để giả mạo chúng) làm cho vấn đề tồi tệ hơn. – dfeuer

+0

@dfeuer Tôi đã thảo luận về độ dài đó với cộng đồng Lisp khi tôi chọn giữa Lisp và OCaml. Các Lispers sẽ trả lời rằng Lisps có thể không có các kiểu dữ liệu đại số nhưng chúng có các macro cho phép bạn viết thư viện mẫu phù hợp của bạn thậm chí còn mạnh mẽ hơn bởi vì bạn có thể thực hiện thống nhất đầy đủ. Tuy nhiên, mô hình phù hợp là phổ biến trong OCaml, F #, Haskell và Scala trong khi thống nhất là hầu như không nghe trong Lisp, Đề án, Racket và Clojure. Vì vậy, tôi nghĩ rằng nó là công bằng để nói rằng Lispers bị mất rằng một. Mẫu phù hợp là cực kỳ có giá trị mà làm cho MLs tốt hơn rất nhiều so với Lisps. –

2

Tôi muốn học ngôn ngữ chức năng để mở rộng chân trời của mình. Tôi có kiến ​​thức về Python và C/C++ và tôi muốn một ngôn ngữ để dễ dàng học hỏi từ một người đến từ miền bắt buộc của ngôn ngữ. Tôi không quan tâm liệu ngôn ngữ đó có đủ mạnh không. Tôi chỉ muốn một ngôn ngữ để tìm hiểu cơ bản của lập trình hàm và sau đó tôi sẽ cố gắng cho một ngôn ngữ khó hơn (và mạnh mẽ).

Câu hỏi hay!

Tôi đã thực hiện BASIC, Pascal, assembler, C và C++ trước khi tôi bắt đầu thực hiện lập trình chức năng vào cuối những năm 1990. Sau đó, tôi bắt đầu sử dụng hai ngôn ngữ chức năng cùng một lúc, Mathematica và OCaml, và đã sử dụng chúng độc quyền trong vòng một vài năm. Đặc biệt, OCaml cho phép tôi viết mã bắt buộc giống như mã tôi đã viết trước đây. Tôi thấy rằng có giá trị như một người học bởi vì nó cho phép tôi so sánh các cách tiếp cận khác nhau mà làm cho những lợi thế của ML rõ ràng.

Tuy nhiên, như những người khác đã đề cập, lợi ích cốt lõi của Mathematica và OCaml là khớp mẫu và không liên quan về mặt kỹ thuật với lập trình hàm. Sau đó tôi đã xem xét nhiều ngôn ngữ chức năng khác nhưng tôi không có mong muốn quay trở lại một ngôn ngữ thiếu kết hợp mẫu.

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