Những lợi thế của việc sử dụng LISP và Haskell là gì? Họ sẽ làm cho tôi trở thành một lập trình viên tốt hơn? [đóng cửa]


41

Tôi biết Lisp và Haskell là ngôn ngữ lập trình logic và chức năng tương ứng, nhưng chính xác thì điều này có nghĩa là gì? Làm thế nào để họ khác với các ngôn ngữ khác? Tôi đã nghe nói rằng học những điều này sẽ giúp bạn trở thành một lập trình viên tốt hơn và cải thiện logic của bạn. Điều này có đúng không, và nếu tôi đi học Lisp hoặc Haskell ở cấp độ có thẩm quyền thì chương trình của tôi sẽ được cải thiện và tôi sẽ xử lý tốt hơn bất kỳ vấn đề nào bằng ngôn ngữ nào? Tôi chỉ muốn biết để xem liệu họ có xứng đáng với nỗ lực học tập. Các ngôn ngữ này cũng hữu ích trong các lĩnh vực như GUI và đồ họa hay chúng chỉ hữu ích cho các ứng dụng console?


36
Sử dụng LISP và Haskell sẽ giúp bạn trở thành một lập trình viên LISP và Haskell tốt hơn, tôi đảm bảo điều đó.
Neil

17
@MasonWheeler Tôi phải nói; có rất nhiều trong hệ thống loại của Haskell mà bạn sẽ không tìm thấy bằng bất kỳ ngôn ngữ nào khác và các macro LISP không có ở bất kỳ ngôn ngữ chính nào. Cả hai điều này đều đáng để học vì chúng làm cho bạn trở thành một lập trình viên giỏi hơn trong ngôn ngữ làm việc của bạn. Ít nhất đây là kinh nghiệm của tôi; Haskell làm cho tôi trở thành một nhà phát triển C # doanh nghiệp tốt hơn. Tôi biết các kỹ thuật để thực hiện phân tách các mối quan tâm một cách sạch sẽ mà tôi sẽ không bao giờ có, và các vấn đề phân tích cú pháp sẽ mãi mãi đơn giản hơn nhiều so với trước khi tôi học Haskell.
Jimmy Hoffa

6
Erlang là một ngôn ngữ chức năng. Rabbit MQ được viết bằng Erlang và Rabbit được sử dụng ở nhiều nơi để thực hiện nhiều nhiệm vụ quan trọng. Các ngôn ngữ chức năng dạy cho bạn suy nghĩ khác về lập trình và đó là một công cụ bổ sung tuyệt vời để bạn sử dụng. Mặc dù đúng là một số khái niệm đã biến nó thành ngôn ngữ phổ biến hơn (ví dụ biểu thức lambda trong C # và C ++), bạn vẫn tiếp cận giải quyết vấn đề theo một cách rất khác khi sử dụng ngôn ngữ chức năng.
Nhị phân nhị phân

8
@MasonWheeler Có những lý do hoàn toàn chính đáng để một ngôn ngữ có thể hữu ích hơn những ngôn ngữ còn lại, nhưng vẫn không được sử dụng rộng rãi. Tôi có thể nghĩ về nhiều thứ: cơ sở người dùng hiện tại, một sự thay đổi quá triệt để, khi "tốt là đủ tốt" và cũng ... khi công cụ tốt hơn đòi hỏi các lập trình viên được đào tạo chính thức hơn. Vì vậy, sự nổi tiếng không phải là một biện pháp hữu ích .
Andres F.

5
@MasonWheeler Để sử dụng một phép loại suy, toán học là một lĩnh vực cực kỳ hữu ích trong cuộc sống thực. Vậy tại sao không có nhiều người thành thạo toán học? Tại sao nhiều người sợ nó và nghĩ rằng đó là ma thuật đen và không thực sự hữu ích?
Andres F.

Câu trả lời:


37

Nó rất giống như học toán sẽ cải thiện kỹ năng phân tích của bạn và học văn học Latin / cổ điển sẽ cải thiện kỹ năng viết của bạn.

Những người thiết kế những ngôn ngữ đó đã suy nghĩ kỹ về việc viết chương trình nghĩa là gì. Và những ngôn ngữ đó là kết quả của những nghiên cứu đó.

Điều đó nói rằng, học Java cũng sẽ làm cho bạn trở thành một lập trình viên tốt hơn. Và học C. Những lợi ích thực sự đến từ việc học ngôn ngữ với triết lý khác nhau. Sau đó, bạn có thể có ý kiến ​​của riêng bạn về cách viết một chương trình.

Chỉnh sửa

Tôi nhận ra câu trả lời này không hữu ích cho những người chưa học haskell và / hoặc lisp. Dưới đây là một số ví dụ để giải thích thêm những gì tôi muốn nói

LISP

Lisp tin rằng cú pháp nên tối thiểu và mọi thứ nên là danh sách hoặc nguyên thủy (Lisp là viết tắt của Xử lý danh sách). Ngay cả các chương trình chủ yếu là danh sách có chứa các danh sách và biểu tượng khác. Lisp cho phép bạn thao tác các chương trình dưới dạng danh sách và để tạo các chương trình mới một cách nhanh chóng. Do đó toàn bộ code is data and data is codephương châm.

Hậu quả trực tiếp là các ngôn ngữ Lisp cho phép bạn xác định bất kỳ giao diện nào bạn muốn. Một ví dụ điển hình là compojure là một khung web clojure. Đây là một chức năng định tuyến trông như thế nào

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Một ví dụ điển hình khác là khung khuôn mẫu nấc:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Như bạn có thể thấy, kết quả cũng ngắn gọn như trong DSL như ria mép, nhưng cho phép bạn sử dụng các tính năng ngôn ngữ như (for [x (range 1 4)] block). Thậm chí đẹp hơn, bạn có tất cả các công cụ để trừu tượng và cấu trúc mã của bạn.

Trong các ngôn ngữ khác, cú pháp phức tạp hơn. Bạn không thể đọc một chương trình Java dưới dạng một loạt các danh sách. Nhưng bằng cách sử dụng Lisp, bạn sẽ hiểu rõ hơn về giao diện lý tưởng sẽ trông như thế nào và những gì trong mã của bạn có thể được trừu tượng hóa thành dữ liệu. Nó cũng giúp bạn thấy ngôn ngữ yêu thích của mình như một cấu trúc dữ liệu lớn và để hiểu rõ hơn về ngữ nghĩa của nó.

Haskell

Haskell tin vào kiểu gõ tĩnh mạnh mẽ và tinh khiết. Các hàm thuần túy giống như các hàm toán học: chúng được xác định trên một tập hợp các giá trị và ánh xạ chúng trên một tập hợp khác. Chức năng không có tác dụng phụ và giá trị là bất biến. Sự tinh khiết là thú vị bởi vì nó không phải là thứ mà một ngôn ngữ đa mô hình có thể có. Một ngôn ngữ là thuần túy hoặc không.

Một hậu quả là bạn không thể thực hiện hành động IO bất cứ khi nào bạn muốn (haskeller tin rằng đây là một điều tốt). Các hành động IO được định nghĩa là các giao dịch, bản thân chúng là các giá trị thuần túy. Các maingiá trị của một chương trình Haskell là một giao dịch IO thực hiện khi bạn chạy chương trình.

Bạn phải đối phó rõ ràng với luồng dữ liệu trong chương trình của bạn. Bạn không thể thực hiện giao tiếp hai thành phần bằng cách viết và đọc nội dung trong một biến toàn cục. Bạn phải xây dựng và vượt qua các giá trị.

Một tính năng khác được đề cập bởi Jimmy Hoffa là hệ thống loại phong phú. Trong khi các ngôn ngữ khác có kiểu gõ tĩnh, trong haskell bạn có thể có những thứ như:

length :: [a] -> Int (hàm từ danh sách của a đến int)

map :: (a -> b) -> [a] -> [b](hàm lấy a to bbiến đổi và danh sách của a và trả về danh sách b)

Điều tuyệt vời là tôi không cần phải giải thích những chức năng đó thực sự làm gì: bạn đã hiểu hành vi của họ. Hơn nữa, các hàm với các chữ ký đó thực sự không thể là gì ngoài việc tính độ dài của danh sách và ánh xạ một biến đổi qua danh sách.

Trong các ngôn ngữ đánh máy khác, hệ thống phân cấp lớp kết hợp với khả năng biến đổi làm cho việc đối phó với các loại đó trở thành một cơn ác mộng. Bạn phải hiểu những thứ như hiệp phương sai và chống đối, không thể có được ngay từ góc độ ngôn ngữ (nghĩa là đơn giản, mạnh mẽ và an toàn).

Hoặc bạn đi theo con đường an toàn (như scala) và kết thúc bằng một ngôn ngữ thực sự phức tạp hoặc bạn đi theo con đường đơn giản và nhận được một cái gì đó bị giới hạn (google go generic giới hạn trong danh sách và bản đồ) hoặc không an toàn (tướng phi tiêu luôn luôn covariant).

Bằng cách sử dụng haskell, bạn chủ yếu tìm hiểu về lợi ích của độ tinh khiết và cách viết mã thuần.


1
@JimmyHoffa Tôi nghĩ rằng thực sự xứng đáng với câu trả lời của riêng mình, bởi vì đây là những gì mọi người có xu hướng bỏ qua. Có những miền vấn đề được giải quyết tốt nhất bằng lập trình chức năng mà mọi người thậm chí không nhận ra tồn tại cho đến khi ít nhất họ đã nhúng vào những miền đó ngoài vùng thoải mái của họ.
KChaloux

2
Tôi không biết về hội, và tôi cũng không đề cập đến nó. Tuy nhiên, lắp ráp có thể giúp bạn hiểu làm thế nào các chương trình của bạn đang chạy. Có những bài viết tuyệt vời về SO của những người có khả năng phân tích một phần của hội đồng được tạo ra để giải thích một vấn đề hiệu suất.
Simon Bergot

3
@KChaloux Tôi sẽ viết câu trả lời nhưng câu hỏi này nên được đóng lại (Tôi đóng bình chọn tương ứng). Nói một cách đơn giản, tôi có thể viết ý kiến ​​và kinh nghiệm của mình vào một câu trả lời, nhưng nó sẽ không đúng hoặc sai hơn các câu trả lời khác, đó là vấn đề là các câu hỏi giới thiệu ngôn ngữ và tại sao tôi bỏ phiếu đóng.
Jimmy Hoffa

7
OMG, @Neil biết những gì máy tính thực sự đang làm một cách chắc chắn nhất sẽ giúp bạn trở thành một lập trình viên tốt hơn. Tôi đã không tập hợp bằng văn bản trong nhiều năm nhưng thường xuyên đọc nó (trên một loạt các nền tảng) và nếu bạn quan tâm đến cách chương trình của bạn thực sự hoạt động, điều tối quan trọng là phải biết ít nhất những điều cơ bản.
dash-tom-bang

3
@Neil, trong trường hợp nào là một lập trình viên tồi tệ hơn là một lợi ích? Điều gì làm cho bạn đưa lên mã spaghetti? Mã spaghetti có liên quan gì đến lắp ráp hoặc là một lập trình viên giỏi, ngoại trừ trong thế giới tưởng tượng không biết lắp ráp và cần hợp lý hóa để tránh học nó? Nếu bất cứ điều gì, là một lập trình viên lắp ráp tốt làm cho người ta nhận thức cao về thực hành mã hóa xấu.
dash-tom-bang

12

tl; dr Học các công cụ mới chỉ có thể giúp bạn trở thành một lập trình viên giỏi hơn, nhưng trở thành một lập trình viên giỏi hơn không phải là về ngôn ngữ bạn có thể viết mã.

Những lợi thế của việc sử dụng LISP và Haskell là gì?

LISP:

  1. Mã đồng tính. Điều này cho phép mã tự sửa đổi cấu trúc.
  2. Các macro nhận biết cú pháp. Họ cho phép viết lại mã soạn sẵn.
  3. Chủ nghĩa thực dụng. CL được thiết kế để hoàn thành công việc bởi các chuyên gia làm việc. Hầu hết các ngôn ngữ chức năng không, như một quy luật.
  4. Mềm dẻo. Nó có thể làm rất nhiều thứ khác nhau, tất cả đều ở tốc độ hợp lý.
  5. Chiến tranh. Thế giới thực lộn xộn. Mã hóa thực dụng kết thúc việc phải sử dụng hoặc phát minh ra các cấu trúc lộn xộn. Lisp thông thường có đủ tính chiến tranh để có thể hoàn thành công việc.

Có thể cho rằng lý do thực sự duy nhất để chọn chống lại CL là các thư viện chuẩn đã được ghi ngày.

Tôi sẽ đi ra ngoài và nói rằng trong trường hợp chung, cú pháp không phải là một vấn đề đối với một nhân viên phần mềm chuyên nghiệp.

Từ: Tại sao Lisp hữu ích?

Haskell:

Haskell là một ngôn ngữ lập trình máy tính. Đặc biệt, nó là một ngôn ngữ được đánh máy tĩnh, đa ngôn ngữ, lười biếng, hoàn toàn khác với hầu hết các ngôn ngữ lập trình khác. Ngôn ngữ được đặt tên theo Haskell Brooks Curry, người làm việc trong logic toán học đóng vai trò là nền tảng cho các ngôn ngữ chức năng. Haskell dựa trên tính toán lambda, do đó lambda chúng tôi sử dụng làm biểu tượng.

Bạn có thể đọc ở đó một mô tả về Chức năng và mệnh lệnh

Từ: http://www.haskell.org/haskellwiki/Intributiontion

Họ sẽ làm cho tôi trở thành một lập trình viên tốt hơn?

Vâng, tất nhiên, biết nhiều ngôn ngữ và mô hình chỉ có thể giúp bạn trở thành một lập trình viên tốt hơn, nhưng hãy nói thẳng:

Không có một công cụ duy nhất, một cuốn sách, một mô hình lập trình duy nhất sẽ giúp bạn trở thành một lập trình viên tốt hơn.

Học các ngôn ngữ lập trình khác nhau với các mô hình khác nhau chắc chắn giúp bạn trở thành một lập trình viên tốt hơn, học cách giải quyết các vấn đề với các lỗi khác nhau cũng có lợi cho tư duy logic của bạn rất nhiều.

Trở thành một lập trình viên giỏi không phải là nhiều về ngôn ngữ, mà là về khả năng giải quyết bất kỳ vấn đề nào trong bất kỳ ngôn ngữ nào. Và khi bạn không biết ngôn ngữ, khả năng học ngôn ngữ đó nhanh chóng và sử dụng nó một cách hiệu quả.

Tôi nghĩ rằng, suy nghĩ của bạn càng toàn cầu, bạn càng phát triển tốt hơn.

Ví dụ: bạn có thể thêm nhận xét hữu ích vào mã của mình, quan tâm đến khả năng đọc mã của bạn, khả năng duy trì. Hãy chú ý đến những chi tiết nhỏ. Hãy suy nghĩ trước khi gõ!. Tìm hiểu về mô hình desing. Thực hiện theo các thực hành tốt.

Tiết lộ: Đây là quảng cáo không biết xấu hổ thuộc loại tồi tệ nhất, bởi vì nó là từ blog của tôi.


4
Bạn đã học LISP hoặc Haskell ở bất kỳ cấp độ có thẩm quyền nào chưa?
Jimmy Hoffa

10
Thật là một chút bất cẩn khi nghe điều này từ một người không biết gì về ngôn ngữ. Bạn khẳng định chúng không phải là công cụ bạn cần ngay bây giờ nhưng bạn không biết chúng là công cụ gì, vậy làm sao bạn biết điều này? Ngoài ra, làm thế nào bạn có thể tư vấn cho ai đó những gì họ sẽ hoặc không học được từ họ, theo như bạn biết LISP là một dẫn xuất SQL chỉ hữu ích trong phân tích dữ liệu quan hệ và Haskell có thể là một tập hợp con nghiêm ngặt của Regapi.
Jimmy Hoffa

10
Điều này không thực sự trả lời câu hỏi. Bạn đã thành công với chiến công ấn tượng khi đưa ra một câu trả lời chung chung mơ hồ cho một câu hỏi về hai ngôn ngữ mà bạn không biết: /
Andres F.

2
-1 bởi vì điều này mơ hồ nhảy xung quanh những gì chính xác Common Lisp và Haskell dạy cho bạn. Ví dụ: Mã dưới dạng dữ liệu Dữ liệu dưới dạng mã, độ tinh khiết, độ trong suốt tham chiếu, trừu tượng đơn âm, lập trình chức năng, lập trình hướng ngôn ngữ, lập trình hướng loại, v.v.
jozefg

3
Hơn nữa, không biết ngôn ngữ nào tôi không nghĩ bạn có thể trả lời câu hỏi đó: / Xin lỗi
jozefg

9

Khi bạn học các ngôn ngữ nằm ngoài mô hình mà bạn thường vận hành, nó sẽ mở ra cho bạn các giải pháp thay thế hàng ngày và thậm chí có thể giúp bạn hiểu một số tính năng trong ngôn ngữ bạn chọn tốt hơn. Chỉ cần biết những ngôn ngữ đó sẽ không giúp bạn trở thành một lập trình viên tốt hơn trừ khi bạn có thể học những bài học bạn học được từ những ngôn ngữ đó và áp dụng nó vào các tình huống bạn nhìn thấy hàng ngày.

Điều đó đang được nói, nó không giới hạn trong các ngôn ngữ. Khi bạn đọc các cấu trúc dữ liệu khác nhau mà bạn chưa từng thấy hoặc sử dụng trước đây, nó có thể giúp mở rộng phạm vi kiến ​​thức của bạn để lần sau bạn gặp phải sự cố, bạn có thêm một giải pháp khả thi.

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.