Lược đồ vs Haskell cho một giới thiệu về lập trình chức năng?


36

Tôi cảm thấy thoải mái với việc lập trình trong C và C #, và sẽ khám phá C ++ trong tương lai. Tôi có thể quan tâm đến việc khám phá lập trình chức năng như một mô hình lập trình khác. Tôi đang làm điều này để giải trí, công việc của tôi không liên quan đến lập trình máy tính và phần nào được truyền cảm hứng từ việc sử dụng lập trình chức năng, được dạy khá sớm, trong các khóa học về khoa học máy tính ở trường đại học. Tính toán Lambda chắc chắn vượt quá khả năng toán học của tôi, nhưng tôi nghĩ rằng tôi có thể xử lý lập trình chức năng.

Mà Haskell hoặc Scheme sẽ phục vụ như một phần giới thiệu tốt cho lập trình chức năng? Tôi sử dụng emacs làm trình soạn thảo văn bản của mình và muốn có thể định cấu hình nó dễ dàng hơn trong tương lai, điều này sẽ đòi hỏi phải học Emacs Lisp. Tuy nhiên, sự hiểu biết của tôi là Emacs Lisp khá khác biệt so với Đề án và cũng mang tính thủ tục hơn so với chức năng.

Tôi có thể sẽ sử dụng cuốn sách "The Little Schemer", cuốn sách mà tôi đã mua, nếu tôi theo đuổi Scheme (có vẻ như tôi hơi kỳ lạ với việc giới hạn lá của mình qua nó). Hoặc sẽ sử dụng "Tìm hiểu bạn một Haskell cho những điều tốt đẹp" nếu tôi theo đuổi Haskell. Tôi cũng sẽ xem các video Giới thiệu về Haskell của Tiến sĩ Erik Meijer trên Kênh 9.

Bất kỳ đề xuất, phản hồi hoặc đầu vào đánh giá cao.

Cảm ơn.

PS BTW Tôi cũng có quyền truy cập vào F # vì tôi có Visual Studio 2010 mà tôi sử dụng để phát triển C #, nhưng tôi không nghĩ đó nên là tiêu chí chính của mình để chọn ngôn ngữ.


3
Đừng quênReal World Haskell
thay thế

15
Nhận xét phụ: tính toán lambda là một hệ thống cực kỳ đơn giản; Điều thú vị về nó không phải là nó phức tạp, mà ngược lại; rằng bạn có thể diễn đạt mọi thứ bạn muốn trong một hệ thống đơn giản như vậy. Bắt đầu với một ngôn ngữ lập trình; bây giờ loại bỏ MỌI THỨ trừ các tham chiếu biến, định nghĩa hàm và gọi hàm. Voila! Tính toán Lambda.


9
Tôi có thể dạy bạn tính toán lambda trong năm phút. Bây giờ, hiểu được hậu quả của những gì bạn vừa học mất cả cuộc đời. :)

5
Tôi đã chọn Haskell trên Scheme chủ yếu vì nó không có quá nhiều dấu ngoặc đơn!
Joey Adams

Câu trả lời:


27

Tôi muốn giới thiệu OCaml.

Theo quan điểm cá nhân của tôi, cơ sở chính của các chương trình chức năng hiện đại là các hàm bậc cao hơn, một hệ thống kiểu tĩnh và các kiểu dữ liệu đại số và khớp mẫu.

Giữa một Đề án, ML và Haskell, tôi sẽ chọn ML vì tôi nghĩ nó phù hợp nhất với định nghĩa này. Lược đồ không có kiểu gõ tĩnh (có Typed Vợt, nhưng nó không dành cho người mới bắt đầu lược đồ) và Haskell có quá nhiều thứ khác (đơn giản, đánh giá lười biếng ...), trong khi thú vị, có thể chuyển hướng sự chú ý khỏi cơ sở quan trọng .

SML và OCaml đều thú vị như nhau; Tôi đã quen với OCaml hơn và nó có cảm giác "thực tế" hơn rất nhiều (nhưng nếu bạn thực sự muốn "thực tế" trước nguy cơ mất linh hồn, bạn cũng có thể chọn F #).

Scheme và Haskell cũng là những ngôn ngữ rất thú vị. Lược đồ nhấn mạnh vào macro rất thú vị, nhưng không liên quan trực tiếp đến lập trình chức năng (đó là một trong những điều khác trên thế giới mà bạn chắc chắn nên thử, cũng như lập trình logic, ngôn ngữ dựa trên ngăn xếp và E hướng theo khả năng).

Haskell chắc chắn là một ngôn ngữ tuyệt vời và, tôi nghĩ, một điểm bắt buộc cho các bậc thầy đầy tham vọng của lập trình chức năng. Nhưng vì ngôn ngữ cốt lõi của OCaml và Haskell rất giống nhau (ngoại trừ việc đánh giá lười biếng gây mất tập trung cho người mới bắt đầu), thật dễ dàng để tìm hiểu Haskell một khi bạn biết những điều cơ bản về OCaml. Hay đúng hơn, bạn có thể tập trung vào những thứ kỳ lạ, và bạn không phải đồng hóa những điều cơ bản cùng một lúc.

Tương tự, một khi bạn đã thấy OCaml, và có thể cả Haskell, và vẫn muốn tìm hiểu thêm, bạn nên xem Coq hoặc Agda. Tuy nhiên, rất ít người muốn giới thiệu Coq hoặc Agda cho lần giới thiệu đầu tiên về lập trình chức năng ...

Để làm rõ quan điểm của tôi: Tôi nghĩ rằng học OCaml (hoặc SML) thì Haskell sẽ giúp bạn trở thành một lập trình viên chức năng tốt như học trực tiếp Haskell, nhưng dễ dàng hơn (hoặc ít đau đớn hơn).
Bên cạnh đó, cả OCaml và Haskell đều có những điều tốt để phân biệt chúng, và thật thú vị khi biết về các tính năng nâng cao của cả hai . Chỉ học Haskell thì kém hơn về khía cạnh đó (mặc dù tất nhiên bạn có thể học OCaml sau Haskell; tôi nghĩ nó ít logic hơn và sẽ khiến bạn thất vọng hơn).

Để học OCaml, tôi muốn giới thiệu bản thảo sách của Jason Hickey (PDF) .

¹ định nghĩa này là tranh cãi. Một số người Scheme sẽ yêu cầu gõ tĩnh không liên quan gì đến lập trình chức năng. Một số người Haskell sẽ cho rằng định nghĩa của họ có độ tinh khiết ( "gì Haskell có, nhưng không còn phải") là một sine qua non điều kiện để trở thành một ngôn ngữ chức năng. Tôi đồng ý không đồng ý.


3
Cảm ơn vì đã đưa tôi đến OCaml, và vâng, tôi sẽ mạo hiểm tâm hồn và khám phá F #. Tôi phát triển cho Linux, Mac OS X và Windows (chủ yếu là trước đây) nhưng FSI dường như có sẵn cho cả ba nền tảng (chạy mono trên Linux và Mac OS X) mà tôi đã làm. Thực tế là toàn bộ trọng lượng của Microsoft đứng sau một ngôn ngữ lập trình chức năng (mặc dù là "không trong sạch"), nên được hoan nghênh thay vì được người hâm mộ lập trình chức năng giải mã.
haziz

SML đã chết, ocaml tồn tại để viết coq
permeakra

1
+1 cho ML; nó rõ ràng hơn Haskell.
m3th0dman

Tôi cũng thấy đó là một ý tưởng tốt khi học SML hoặc OCaml, sau đó là Haskell (+1). Sau khi biết các ngôn ngữ này, chọn một ngôn ngữ khác (ví dụ Scala) là rất dễ dàng. Ngoài ra, người ta có thể nhìn vào Scheme, Common Lisp và Clojure (theo thứ tự này), để có cảm giác về các ngôn ngữ động.
Giorgio

@haziz: Ngay cả khi họ tạo ra phần mềm tốt, Microsoft (hoặc, đối với vấn đề đó, Oracle, v.v.) vẫn là nhà độc quyền, với tất cả các thực tiễn xấu liên quan như khóa khách hàng, định dạng không tương thích, triển khai không tương thích, v.v.
Giorgio

26

Nếu bạn quan tâm đến các khái niệm nâng cao hơn trong lập trình chức năng, thì hãy đến với Haskell. Có một hệ thống loại thích hợp và nghiêm cấm chống đột biến. Tuy nhiên, Haskell không dành cho những người yếu tim.

Nếu bạn chỉ muốn giới thiệu về thiết kế chức năng, hãy đi với Scheme. Cú pháp dễ học và đọc hơn nhiều. Nó không cho phép lập trình thủ tục, nhưng chỉ kỷ luật bản thân bạn không sử dụng bất kỳ thủ tục nào với! phần cuối của tên.

Với Scheme, bạn cũng có thể đọc Cấu trúc và diễn giải các chương trình máy tính , đây là phần giới thiệu tốt nhất về mô hình lập trình. Có những bài giảng về cuốn sách từ cả MITBerkeley .


4
"Cú pháp dễ học và đọc hơn nhiều" rất chủ quan.

6
@luqui: Đúng. Có lẽ "thường xuyên" là một từ tốt hơn. Không có backticks, infixes, ưu tiên, hoặc các vấn đề kết hợp --- chỉ là dấu ngoặc đơn, rất nhiều dấu ngoặc đơn, ngớ ngẩn.
Hoa Long Tâm

17

Câu trả lời đúng là, tất nhiên, cả hai! Vì vậy, nó chỉ là một câu hỏi về ngôn ngữ để giải quyết đầu tiên. Hoàn cảnh của tôi giống hệt bạn. Tôi thực sự rất thích The Little Schemer vô cùng. Bạn chắc chắn sẽ hiểu các cấu trúc cơ bản của lập trình chức năng sau khi vượt qua điều đó (và có một nơi để đặt vết thạch của bạn!)

Tôi khoảng một phần tư để học cho bạn một Haskell cho những điều tốt đẹp. Tôi cũng thích điều đó một chút, nhưng hai cuốn sách không thể khác hơn. Learn You a Haskell có cách tiếp cận rất truyền thống để dạy một ngôn ngữ cụ thể. Rõ ràng, Little Schemer đặc trưng cho Scheme, nhưng quan tâm nhiều hơn đến việc dạy các nguyên tắc cơ bản của lập trình chức năng, chứ không phải ngôn ngữ của Scheme.

Tôi chắc chắn khuyên bạn nên bắt đầu với The Little Schemer. Nó ít thực tế hơn, nhưng cơ bản hơn.


17

Hai xu của tôi liên quan đến lập trình chức năng là không bị gục ngã trên một ngôn ngữ cụ thể, mà học các khái niệm chính của lập trình chức năng. Tôi đã học lập trình chức năng bằng cách ném đầu tiên vào một dự án trong đó ông chủ của tôi khẳng định tất cả sự phát triển phải được thực hiện trong APL. APL là một ngôn ngữ xử lý mảng chức năng và cách xa LISP, Haskell hoặc bất kỳ ngôn ngữ lập trình chính thống nào khác mà bạn có thể có. Phần thưởng thực sự là khi tôi phát hiện ra rằng một khi tôi "mò mẫm" mô hình lập trình chức năng và tinh thần học cách tự động phân tách một vấn đề thành một chương trình chức năng, tôi thực sự không còn bị đe dọa bởi các khía cạnh thành ngữ của các ngôn ngữ chức năng khác như Haskell, OCaml, Đề án, Scala và Clojure. TÔI'

Nếu tôi chọn ngôn ngữ chức năng đầu tiên, có lẽ tôi sẽ chọn Haskell hoặc Steel Bank Common Lisp (SBCL). Đối với Haskell, tôi đã đọc Tìm hiểu bạn một Haskell ... , Real World Haskell , Con đường Haskell đến Logic, Toán học và Lập trình , và Ngọc trai của Thiết kế Thuật toán Chức năng . Đối với CL, tôi đã đọc Land of Lisp , Paradigms of Artificial Intelligence , và (nếu bạn thực sự khó tính) Hãy xem qua Lambda . Bạn có thể trộn và kết hợp tất cả những cuốn sách đó để có cái nhìn tổng quan về các phương pháp và khái niệm lập trình chức năng thực tế.

Tôi cũng sẽ xem xét việc học Clojure và Scala, vì cả hai đều là ngôn ngữ chức năng rất tốt và rất biểu cảm theo cách riêng của họ (bất chấp những gì người theo chủ nghĩa thuần túy của FP có thể nói).


6

Tôi đồng ý với điểm "tìm hiểu cả hai", nhưng cho đến nay vẫn còn một vài điểm chưa được đề cập. Trước hết, nếu bạn chưa quen với lập trình chức năng và bạn đi với Haskell, thì bạn cần phải đối mặt với một số điều mới ngoài FP: bạn cần học cách sống trong một môi trường lười biếng, có thể mất một nỗ lực đáng kể, và bạn cần để đối phó với một hệ thống loại "thực" có thể rất xa so với những gì bạn sử dụng trong C hoặc C #.

Lược đồ, OTOH, có một cú pháp tìm kiếm nước ngoài, nhưng không có hệ thống kiểu tĩnh để học và đó là một ngôn ngữ nghiêm ngặt để mọi thứ trở nên quen thuộc hơn. Ngoài ra, việc triển khai Đề án có xu hướng rất dễ uốn - ví dụ, Vợt đưa điều đó đến mức cực đoan và cung cấp một biến thể lười biếng và một kiểu gõ tĩnh. Điều này có nghĩa là bạn có thể bắt đầu với những thứ "dễ dàng" và sử dụng ngôn ngữ chức năng, và sau này bạn có thể tự mình phát triển và sử dụng biến thể gõ và lười biếng. Bây giờ chúng sẽ dễ dàng hơn vì bạn có thể xử lý một tính năng tại một thời điểm. Để rõ ràng, các khái niệmsẽ đủ mới để vấn đề cú pháp sẽ trở nên nhỏ và chủ yếu không liên quan. Nói cách khác, một khi bạn bắt đầu tiếp cận các khái niệm mới, bạn sẽ bận rộn đến mức cú pháp sẽ biến mất. (Và nếu bạn thực sự quan tâm đến cú pháp, thì cú pháp của Haskell là thứ mà cá nhân tôi cho là rất thanh lịch - nhưng đó là vì nó cũng rất xa so với cú pháp C / C # / C ++ trung bình của bạn.)

Nhưng đã nói tất cả những điều đó, tôi nghĩ rằng cũng có một điểm tốt cho F # - bạn nói rằng bạn làm điều này như một điều phụ, nhưng khi bạn học FP, bạn sẽ sớm muốn sử dụng tất cả những thứ tốt đó. Sử dụng F # có nghĩa là bạn có thể làm nhiều việc "thực tế" hơn vì có thể dễ dàng giải quyết cùng loại vấn đề mà bạn giải quyết trong công việc hàng ngày. Lý tưởng nhất là bạn sẽ đến một điểm mà bạn sẽ thấy lợi thế của việc sử dụng nó, giả sử, C # - và sử dụng nó trong một số dự án. Vì vậy, trong khi bạn đúng khi không chọn F # chỉ vì bạn dễ truy cập hơn, bạn nên xem xét nó vì không có gì tốt hơn thực tế sử dụngnhững khái niệm mới. Ngược lại, nếu bạn sử dụng Scheme hoặc Haskell và coi đó là ngôn ngữ đồ chơi cho mục đích của bạn (ngay cả khi bạn biết rằng một số người sử dụng nó cho các ứng dụng thực tế), thì bạn sẽ không bao giờ coi trọng toàn bộ điều FP. [Nhưng YMMV, chủ yếu dựa trên những quan sát chủ quan và có thể thay đổi rất nhiều từ người này sang người khác.]


6

Có bất kỳ lý do tại sao ML không phải là một trong những lựa chọn của bạn? Có một số lượng khá lớn các tài liệu giới thiệu có sẵn bao gồm sách và tài liệu hướng dẫn khóa học. Nếu bạn thích The Little Schemer, bạn cũng có thể thưởng thức The Little MLer. Cuối cùng, bạn có thể dễ dàng thực hiện chuyển đổi sang F # sau này. (Không phải tôi đang gõ Haskell hay Scheme - lý tưởng là học cả ba).

Ngoài ra, một lời cảnh báo về Emacs Lisp. Tôi không nghĩ rằng Haskell hoặc ML sẽ chuẩn bị cho bạn. Một ngôn ngữ Lispy như Scheme sẽ giúp ích nhưng vẫn có những khác biệt lớn, ví dụ. biến động phạm vi. Các phần mở rộng của Emacs, về bản chất, có xu hướng cấp bách hơn chức năng - tất cả đều nhằm thay đổi trạng thái của trình soạn thảo.


Cảm ơn vì đã đưa tôi đến ML / OCaml, và vâng, tôi sẽ "mạo hiểm tâm hồn" và khám phá F #. Tôi phát triển cho Linux, Mac OS X và Windows (chủ yếu là trước đây) nhưng FSI dường như có sẵn cho cả ba nền tảng (chạy mono trên Linux và Mac OS X) mà tôi đã làm. Thực tế là toàn bộ trọng lượng của Microsoft đứng sau một ngôn ngữ lập trình chức năng (mặc dù là "không trong sạch"), nên được hoan nghênh thay vì được người hâm mộ lập trình chức năng giải mã.
haziz

BTW Tôi đã đặt hàng The Little MLer từ Amazon và đã nhận được nó và bắt đầu Hành trình của tôi. Tôi cũng vừa thêm Học F # vào thư viện của mình. Có vẻ là một hướng dẫn giảng dạy chính thống hơn, mà tôi sẽ sử dụng để bổ sung cho Little MLer.
haziz

6

Viết cho mình một Đề án trong 48 giờ (bằng haskell)

Tôi thực sự khuyên bạn nên điều này. Bạn sẽ học Haskell bằng cách sử dụng một vấn đề thực sự và thú vị, và bạn sẽ học được bài học tốt nhất về sơ đồ từ việc chơi với trình thông dịch bạn xây dựng. Nếu bạn đi theo con đường này, hãy giữ một vài lời giới thiệu tốt về Haskell. Bạn sẽ hiểu họ hơn nếu bạn có một vấn đề cần giải quyết.


Tôi thực sự đã sử dụng wiki / pdf này để học Haskell và cải thiện các kỹ năng OCaml của mình (bằng cách dịch Haskell thành ngữ sang OCaml). Sẽ thật tuyệt nếu ai đó có thể lấy tài liệu này và "fork" nó cho một số ngôn ngữ chức năng. Có thể là cơ sở cho một loạt đá luân lưu ngôn ngữ chức năng khá mát mẻ!
Marc

1
Vấn đề chính với điều này là nó giới thiệu Parsec mà không giới thiệu các đơn nguyên.
thay thế

@alternative Parsec có giao diện Monadic, nhưng nó cũng có giao diện Applicative, chưa kể nhiều chức năng khác. Không phải là không hợp lý khi giới thiệu Parsec trước khi khái quát hóa đơn âm
Philip JF

4

Tôi sẽ đi với Haskell. Trong sơ đồ, bạn có thể được khuyến khích thực hiện các công cụ thủ tục và hệ thống loại của nó gần như không hữu ích với Haskell, điều này rất tốt cho người mới bắt đầu vì nó kiểm tra khá nhiều mã của bạn có đúng lúc biên dịch không.


3
"khá nhiều kiểm tra rằng mã của bạn là chính xác" là rất sai. Không có hệ thống loại nào có thể làm điều đó. (Trừ khi hệ thống loại của bạn là một người ủng hộ định lý thực sự.)
Eli Barzilay

4
@Eli, bạn đã sử dụng Haskell? Mặc dù về mặt lý thuyết, tuyên bố này rõ ràng là sai, nhưng trong thực tế tôi thấy nó khá chính xác, ít nhất là so với mọi ngôn ngữ khác mà tôi đã sử dụng. Điều đó nói rằng, tôi thực sự không đồng ý rằng đây là một tài sản tốt cho người mới bắt đầu. Khi tôi học các sợi dây, tôi thà thấy cụ thể mã của mình đã làm gì sai, thay vì trình biên dịch mắng tôi rằng nó sai và phải chiến đấu với nó khi tôi thậm chí không biết từ vựng mà các thông báo lỗi đang sử dụng.

1
@Eli "khá nhiều" là thuật ngữ chính ở đây. Trong Haskell bạn dành nhiều thời gian hơn để suy nghĩ về cách triển khai nó, sau đó việc triển khai diễn ra khá dễ dàng. Sau đó, bạn đánh máy nó để đảm bảo bản đồ, nếp gấp, v.v. của bạn là lành mạnh.
thay thế

@Eli Barzilay: Hệ thống loại của Haskell có vẻ như rất gần với việc trở thành một người hoạt động theo định lý. Nó chắc chắn tạo ra một môi trường nơi các định lý provers dường như phổ biến hơn các công cụ khác. (Không phải tôi đang ám chỉ một mối quan hệ nhân quả.)
greyfade

@luqui - Vâng, tôi đã sử dụng nó; không, đó vẫn là một tuyên bố sai, cả về thực tế và lý thuyết. Đó không phải là thứ gì đó độc nhất với Haskell.
Eli Barzilay

1

Tôi nghĩ thật dễ dàng để bị cuốn vào các cuộc tranh luận về ngôn ngữ và bỏ lỡ vấn đề. Đối với ai đó chỉ muốn tìm hiểu về FP, thì sự khác biệt giữa Ocaml / ML / Scheme / Haskell không quan trọng bằng một nửa sự thoải mái của bạn với tài liệu (sách, video, công cụ) mà bạn sử dụng để tìm hiểu. Và liệu bạn có một người bạn để giúp bạn học một số ngôn ngữ nhất định hơn mọi thứ khác hay không.


0

Nếu nó không thuần túy, bạn cũng có thể sử dụng một ngôn ngữ bắt buộc, vì vậy Haskell.


0

Trong một trong những câu trả lời bạn nhận được cho câu hỏi của bạn, tôi thấy liên kết này khá thú vị, bởi vì nó mang đến cho bạn một hương vị của Haskell và Scheme.

Ngoài liên kết tiện lợi đó, đây là câu hỏi của tôi.

Nếu bạn đến từ một nền tảng lập trình bắt buộc, bạn có thể sẽ nỗ lực rất nhiều để học lập trình chức năng. Tôi chắc chắn rằng kinh nghiệm học tập không trống rỗng. Đó là bạn có thể áp dụng nó cho công việc hiện tại hoặc tiếp theo của bạn hoặc nó sẽ giúp bạn theo một cách khác.

Có rất nhiều ngôn ngữ tốt ngoài kia. Người Scala sẽ trích dẫn ngôn ngữ của họ, cũng như dân tộc Clojure và CL. Ngay cả Pythonistas cũng tuyên bố sự lười biếng. Những người khác trả lời bạn đề nghị ML. Amit Rathore , người đã viết Clojure in Action thậm chí có thể đề nghị bạn học Haskell.

Bạn đã đề cập đến Windows và F #. Điều đó sẽ giúp bạn ở vị trí hiện tại của bạn? Tôi không biết gì về F #. Nó có đủ chức năng không? Tôi hỏi điều đó, bởi vì IMHO Python có các cấu trúc chức năng, nhưng nó không giống như lập trình trong Clojure.

Tóm lại, hãy học một ngôn ngữ chức năng có chức năng "thực sự" và làm như vậy có ý nghĩa nhất cho tình huống của bạn.


-2

Từ quan điểm của người mới bắt đầu, tôi khuyên bạn không nên bắt đầu với SICP nếu bạn quyết định Đề án, trừ khi toán học của bạn khá thành thục. Cuốn sách và video chứa đầy sự tinh tế và hoàn toàn không trực quan với người bắt đầu.

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.