it-swarm-vi.com

Haskell VÀ LISP so với Haskell OR Lisp

Tôi hiện đang viết mã bằng C, C++ và Python. Tôi muốn chọn một ngôn ngữ lập trình chức năng, và ngay bây giờ tôi đang nghiêng về Haskell. Tôi KHÔNG muốn bắt đầu cuộc chiến "Haskell vs LISP" ở đây; điều tôi muốn biết là đây: nếu tôi học Haskell chủ yếu để tiếp xúc với lập trình chức năng, tôi sẽ nhận được những lợi ích gì nếu có sau khi học Lisp?

41
Zeke

Tôi đề nghị học cả hai, Haskell trước, sau đó là LISP chung. Kinh nghiệm của tôi với Haskell là việc gõ tĩnh dường như là một sự khó chịu hạn chế lúc đầu, nhưng một khi tôi đã quen với nó, tôi nhận thấy rằng hầu hết các lỗi loại của tôi đều có lỗi logic ẩn sau chúng. Khi bạn đạt đến điểm này và cột mốc tiếp theo, đó là học cách suy nghĩ theo các loại và xác định loại của riêng bạn như một phương tiện để thể hiện giải pháp của bạn, bạn sẽ sẵn sàng cho LISP chung.

Với Common LISP, bạn có thể thêm các đơn nguyên, cà ri và mọi thứ bạn thích từ Haskell, nhưng bạn cũng nhận được nhiều quyền thừa kế như Frank Shearar đã đề cập và các chức năng chung với nhiều công văn và hệ thống xử lý ngoại lệ nâng cao.

Vậy tại sao không học LISP thông thường trước? Xuất phát từ một thủ tục và OOP, kinh nghiệm của tôi là tôi không thực sự hiểu lập trình chức năng cho đến khi tôi phải sử dụng riêng. Một khi lập trình chức năng thoải mái, bạn có thể thêm phần còn lại của các công cụ mà Common LISP cung cấp và sử dụng bất kỳ công cụ nào là tốt nhất trong nhiệm vụ.

58
Larry Coleman

Và làm ơn.

Haskell dạy cho bạn sự thuần khiết nhất của FP, theo như tôi biết ít nhất, giống như Smalltalk dạy về sự thuần khiết nhất của OO. (Tôi đề cập đến điều này không phải để gợi ý rằng OO và FP không thể kết hôn, nhưng vì cả hai ngôn ngữ này đều là ngôn ngữ "đá quý" - một ý tưởng cốt lõi cực đoan.)

LISP thực sự là một gia đình ngôn ngữ, vì vậy tôi sẽ nói về LISP chung vì đó là thành viên cụ thể của gia đình tôi sử dụng.

LISP vẫn sẽ có nhiều điều để dạy bạn:

  • Đó là đa hướng, vì vậy dsimcha chỉ ra nó sẽ chỉ cho bạn cách tích hợp FP với các mô hình khác.
  • LISP sẽ dạy cho bạn rằng "code-is-data, data-is-code", ví dụ như thông qua các macro của nó.
  • CLOS là một thương hiệu OO rất thú vị, với nhiều kế thừa hoạt động và các chức năng chung.
31
Frank Shearar

Haskell và LISP là hai quái thú hoàn toàn khác nhau.

Haskell là loại "lập trình chức năng thuần túy trong một tháp ngà"

LISP là loại "code-is-data/data-is-code/tạo cấu trúc ngôn ngữ của riêng bạn". Bạn có thể thao tác mã của bạn theo bất cứ cách nào bạn có thể tưởng tượng.

Họ rất khác nhau. Cả hai đều có chung khía cạnh "lập trình chức năng", nhưng đó thực sự là một điểm chung nhỏ bé so với sự khác biệt của chúng. Chỉ cần thử chúng và bạn sẽ thấy chúng khác nhau như thế nào!

11
dagnelies

Học LISP sau này sẽ cho phép bạn tùy chỉnh Emacs, được cho là trình soạn thảo văn bản tiên tiến nhất hiện có. Bạn không thể làm điều đó trong Haskell.

11
user1249

Lợi ích chính tôi thấy được từ việc học LISP là học cách tích hợp FP thành ngôn ngữ đa hướng theo thế giới thực, thay vì chỉ học nó trong ngữ cảnh của ngôn ngữ hàn lâm nhấn mạnh đến sự thuần khiết.

7
dsimcha

Tôi cũng đến từ nền tảng C/C++/Python và đã thử FP một vài lần trong vài năm qua. Ban đầu tôi nhìn vào Haskell và không thể tạo ra đầu hoặc đuôi của nó , sau đó đã thử Ocaml nhưng không tiến xa hơn với điều đó. Cuối cùng tôi bắt đầu nghe những điều hay về Scala, đã thử nó và thấy nó rất phù hợp với tôi (tôi cũng đã thực hiện một chút Java = trong quá khứ), đến mức sau một năm lao vào Scala (và gửi 161 vấn đề về Project Euler với nó), Haskell dường như có ý nghĩa hơn nhiều. chỉ cần đặt mua một vài cuốn sách về Haskell và muốn cho nó đi tiếp, mặc dù điều này phần lớn được thúc đẩy bởi sự tồn tại của Scalaz.

Vì vậy, tôi đã tìm thấy bằng cách sử dụng một ngôn ngữ đa mô hình (ví dụ Scala, nhưng LISP có thể cũng phù hợp với dự luật) một cách tốt vào FP. Nhưng nếu bạn vui vẻ lặn vào Haskell (tôi không), hãy đi cho nó.

5
timday

Ban đầu tôi đến từ nền C/C++/Ruby và tôi đã sử dụng các khái niệm FP trong Ruby bất cứ khi nào tôi có thể. Nhà nước chỉ làm tổn thương não của tôi. Một trong những người bạn của tôi đã gọi tôi lên một ngày, và anh ấy yêu cầu tôi viết một cái gì đó bằng Haskell (công việc đầu tiên của tôi - và hy vọng không kéo dài - công việc Haskell!). Tôi nhanh chóng học ngôn ngữ và tôi đã ném một cái gì đó hoạt động. Nó không đẹp hay gì cả, nhưng nó đã hoạt động.

Tôi đã nghỉ một tháng từ Haskell vì tôi không có gì để sử dụng. Nhưng khi tôi quyết định cần viết phần mềm blog của riêng mình, tôi đã sử dụng Haskell ( https://symer.io ). Haskell thực sự tuyệt vời vì bạn có thể chia một vấn đề thành các phần và thực hiện các phần này khác nhau dựa trên đầu vào. Haskell cũng xử lý thất bại cực kỳ tốt thông qua quyền anh thông minh của các giá trị. Có rất nhiều công cụ để làm việc với các hộp này mà bạn chỉ cần quên chúng tồn tại.

Trải nghiệm của tôi với LISP (Scheme) là hoàn toàn tiêu cực. Ngôn ngữ không chỉ thiếu những công cụ đơn giản, thông minh này mà còn cảm thấy lỏng lẻo nguy hiểm như Ruby hoặc JavaScript. Đó là một trải nghiệm khủng khiếp và nó không cung cấp gì mới ngoài Ruby hoặc Python.

C++ không thể giữ một ngọn nến cho Haskell, ngoài quản lý bộ nhớ. Haskell cũng nhanh như vậy (nếu không nhanh hơn), ngắn gọn hơn đáng kể và an toàn hơn nhiều. Nhưng sự an toàn của Haskell không bao giờ cản trở.

TL; TR Haskell là một luồng không khí trong lành, và LISP là một Ruby có chức năng hơn một chút.

2
Nate Symer