Haskell VÀ Lisp so với Haskell HOẶC Lisp [đã đóng]


40

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 sau này?


1
Và F # và Clojure.
cnd

Câu trả lời:


58

Tôi đề nghị học cả hai, Haskell trước, sau đó là Common Lisp. Kinh nghiệm của tôi với Haskell là kiểu gõ tĩnh ban đầu có vẻ hạn chế sự khó chị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 Common Lisp.

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 Common Lisp trước? Xuất thân từ một nền tảng 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 nó độc quyền. 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ụ.


6
Tôi nghĩ rằng bạn đóng đinh nó - điều làm cho Haskell và Smalltalk trở nên hữu ích cho việc học là sự thuần khiết của chúng.
Frank Shearar

4
Tôi đồng ý với sự thuần khiết làm cho việc học một ngôn ngữ dễ dàng hơn rất nhiều. Tôi không thể hiểu ngôn ngữ chức năng với LISP vì mọi thứ đều có thể có trong ngôn ngữ và tôi có quá nhiều nền tảng OO bắt buộc. Nhưng trong Haskell, không có khái niệm nào làm gián đoạn việc học.
Eonil

1
Thật buồn cười, tôi đã có trải nghiệm ngược lại. Tôi đã chọn những điểm chính của lập trình chức năng thông qua Scheme, ngôn ngữ đầu tiên của tôi. Thỉnh thoảng tôi hack Haskell và tôi chắc chắn thấy rằng tôi phải học lại 90% + những thứ mà tôi biết mỗi khi tôi rời Haskell một lúc. Điều đó đang được nói, Haskell là một ngôn ngữ vô cùng phong phú, với một số lượng lớn để dạy cho bạn (rất cưỡng bức.) Các loại Các loại Các loại! Thực hiện theo các loại!
Josh Infiesto

31

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 bởi vì cả hai ngôn ngữ này đều là ngôn ngữ "đá quý" - một ý tưởng cốt lõi được đưa ra đến mức cực đoan.)

Lisp thực sự là một gia đình ngôn ngữ, vì vậy tôi sẽ nói về Common Lisp 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à tính đa hướng, do đó, dsimcha chỉ ra rằng 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ụ 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.

11

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.


14
[Làm sắc nét dấu ngoặc đơn của anh ấy]
Inaimathi

6
Có lẽ ai đó có thể viết một trình soạn thảo văn bản cho nó. Tôi nghe nói hệ điều hành Emacs không đi kèm với một. (Tôi nhóc. Tôi biết bạn có thể có chế độ Viper. :)
greyfade

14
Trên thực tế, có một bản sao Emacs được gọi là Yi, sử dụng Haskell theo cách chính xác giống như Emacs sử dụng Lisp. Trong thực tế, so với Emacs (GNU), Yi thậm chí còn tinh khiết hơn, bởi vì hạt nhân của nó cũng được viết bằng Haskell, trong khi hạt nhân Emacs thường có xu hướng không được viết bằng Lisp. Hạt nhân của GNU Emacs được viết bằng C, JEmacs 'được viết bằng Java chẳng hạn.
Jörg W Mittag

2
@ Jörg, nếu đó là một sự tái hiện một phần thay vì một bản sao đầy đủ của GNU Emacs hoặc XEmac, thì đó không phải là điều tương tự. Tương tự như so sánh Word với Wordpad hoặc Notepad.

1
@ Thorbjørn Ravn Andersen: Có, nhưng không đến nỗi tệ. :)
greyfade

11

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!


+1: Điểm tốt. Tôi biết một số Haskell và một số Lisp. Mặc dù tôi không phải là một chuyên gia trong số họ, tôi nghĩ bạn đúng rằng họ rất khác nhau. Trong Haskell, bạn không có ý tưởng sử dụng dữ liệu làm mã. Trong Lisp bạn không có khớp mẫu (AFAIK). Có lẽ danh sách (!) Của sự khác biệt là dài hơn.
Giorgio

7

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


5
Tôi đoán bạn muốn có một cuộc chiến "Haskell vs Lisp"!
Don Roby

3
Haskell một ngôn ngữ học thuật nhấn mạnh đến sự tinh khiết ... và rất nhiều người sử dụng nó trong thế giới thực. Smalltalk cũng ở trong trại đó.
Frank Shearar

Rất nhiều người sử dụng Haskell trong thế giới thực?
Jon Harrop

1
@Jon Harrop: Chà, tôi sử dụng Haskell trong thế giới thực (và nó hoạt động thực sự tốt cho một số ứng dụng nhất định), có lẽ tôi là một trong số ít (?)
Giorgio

5

Tôi cũng đến từ nền tảng C / C ++ / Python và đã thử dùng 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 cái đầu hay cái đuôi của nó, sau đó thử Ocaml nhưng không thể 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 đã từng làm một chút về Java trong quá khứ), đến mức sau một năm say mê Scala (và gửi 161 Project Euler có vấn đề với nó), Haskell dường như có ý nghĩa hơn nhiều. Trên thực tế, tôi chỉ đặ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 chủ yếu đượ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ó.


Thật thú vị khi bạn có nhiều hơn với Scala hơn OCaml. Làm thế nào mà?
Jon Harrop

@Jon: Câu hỏi hay; khó nói. Có lẽ lúc đó tôi chưa sẵn sàng "vào" chức năng. Có lẽ tôi chỉ tình cờ tìm thấy một hướng dẫn Scala được đặt ở cấp độ phù hợp. Có lẽ dòng C / C ++ / Java của Scala chỉ khiến nó trở nên xa lạ hơn một chút. Đưa ra bất kỳ đặt cược hợp lý nào trong những ngày này sẽ là trên F # chứ không phải Scala, có lẽ tôi sẽ xem lại tên miền OCaml vào một lúc nào đó, mặc dù tôi đã tìm hiểu về công cụ này chỉ vì niềm vui tuyệt đối khi đi vào một "tư duy lập trình" khác với C ++ của tôi dayjob, tôi có thiên hướng thử lại Haskell lần sau.
timday

Cách tiếp cận chuyển động mượt mà :)
Eonil

2

Ban đầu tôi đến từ nền tảng 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 đã cùng nhau làm một cái gì đó hiệu quả. 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.

Kinh 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ụ thông minh, đơn giản này mà còn cảm thấy lỏng lẻo nguy hiểm như Ruby hay JavaScript. Đó là một trải nghiệm khủng khiếp và nó không mang lại điều gì mới ngoài Ruby hay 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.

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.