2010-07-04 36 views
31

thể trùng lặp:
Haskell vs. procedural programming in the real worldTại sao tôi nên học haskell?

ít lần tôi nghe người ta nói những câu như "Mỗi lập trình viên nên biết Haskell", "Bạn không phải là một lập trình viên nếu bạn không biết Haskell "và vân vân. Tuy nhiên, tôi không chắc chắn chính xác nếu tôi nên bận tâm cố gắng để có được một sự hiểu biết ngắn gọn về ngôn ngữ đó hay không. Chơi xung quanh với thông dịch viên (để có được sự hiểu biết trực quan về vấn đề cơ bản) sẽ mất ít nhất vài ngày (nếu không phải tuần), và tôi "m không chính xác chắc chắn nếu kết quả sẽ được giá trị nó.

Một chút nền (để có được ý tưởng về kiến ​​thức của tôi)
Tôi đã bắt đầu lập trình như một đứa trẻ (một nơi nào đó từ 10 đến 13 năm trước) với máy tính có thể lập trình, được chuyển sang cơ bản, sau đó vào lắp ráp non-x86 (nhân lại và phân chia và viết chuột tự sửa đổi) Biết cách của tôi xung quanh vỏ unix, có thể viết phần mềm trong python và có lẽ trong bất cứ điều gì (nếu tôi có một cuốn sách tham khảo gần đó) mà từ xa tương tự như C + + hoặc Pascal (tức là các khối, kiểm soát dòng chảy tương tự, vv) Chuyên môn là lập trình 3D và shaders. "Cá trong nước" với các hoạt động cấp thấp (Cs phân bổ bộ nhớ tyle, con trỏ), ít thoải mái hơn với phương pháp tiếp cận cực kỳ OOP (tức là khi lớp học được thực hiện vì lợi ích của việc có lớp). Hầu như hoàn toàn tự học. I E. chắc chắn không phải là một newbie, nhưng có những lĩnh vực mà tôi có thể cải thiện.

Vì vậy, ... tôi có thể thu được những gì từ việc nghiên cứu Haskell tại thời điểm này? Theo như tôi biết, ngôn ngữ này không thực sự được sử dụng rộng rãi, kết quả là có ít thư viện có thể giao tiếp với (như với lập trình Delphi - bạn có thể lập trình DirectX trong delphi, nếu bạn thực sự muốn, nhưng bạn có thể 't viết 3dsmax/maya plugin với nó (tốt, nó có lẽ là lý thuyết có thể, nhưng nó chắc chắn sẽ không được dễ dàng)). Tôi cũng không nghĩ rằng tôi sẽ dễ dàng có thể cắm một đoạn mã Haskell vào công cụ trò chơi.

Vì vậy, tôi có thể nhận được những kiến ​​thức hữu ích nào từ nó?

P.S. Tôi sẽ không mua "nếu bạn học một ngôn ngữ khác, có thể bạn sẽ học cái gì đó có thể là" đối số "hữu ích.

+0

Có thể trùng lặp? http://stackoverflow.com/questions/1604790/what-is-haskell-actually-useful-for –

+2

@Sergio Tapio: Tôi không nghĩ vậy. Câu hỏi của bạn hỏi "nơi tôi sẽ có thể sử dụng haskell", tôi hỏi "loại kiến ​​thức hữu ích tôi sẽ nhận được từ nó". Tôi không quan tâm liệu ngôn ngữ có phổ biến hay không, nhưng nếu nó dạy một số loại khái niệm tôi sẽ có thể (có thể) nộp đơn xin lại bằng ngôn ngữ khác, nó có thể đáng giá thời gian của tôi. – SigTerm

+3

Một dup khác: http://stackoverflow.com/questions/1024585/haskell-vs-procedural-programming-in-the-real-world – Konerak

Trả lời

72

(Chắc chắn đây là một câu hỏi trùng lặp, nhưng tôi không thể tìm thấy ngay bây giờ.)

Bạn tìm hiểu nó để học lập trình chức năng thuần túy, mà buộc bạn phải làm nhiều thứ theo một cách hoàn toàn khác nhau. Bạn có một cách suy nghĩ mới. Lập trình không có trạng thái? Lập trình mà không có hiệu ứng? Mọi thứ đều lười biếng? Hệ thống loại điên với suy luận kiểu? Cái quái gì vậy? Tâm trí của bạn sẽ bị thổi bay nhiều lần, nhưng cuối cùng bạn sẽ có những quan điểm/kỹ thuật mới từ lập trình hàm mà khó có thể nhận được mà không cần đến Haskell toàn diện.

Vấn đề với cố gắng cụ thể, là cố gắng nói với người không phải là Haskeller những gì họ sẽ học được từ Haskell giống như cố gắng giải thích màu "xanh" cho người mù.

+14

BTW, phản ứng với "hệ thống kiểu điên" - Tôi thấy hệ thống kiểu Haskell là thứ tự nhiên nhất có thể tưởng tượng được. có hệ thống loại hợp lý như vậy. :-) – ShreevatsaR

+0

@Shreevatsa, Nếu "tự hỏi" của bạn không phải là hùng biện, thì: "khác" ngôn ngữ không có hệ thống kiểu như vậy bởi vì chúng được định hướng cho các hoạt động thực hiện trong khi thực hiện (thậm chí OO langs), không phải để làm đẹp ký hiệu hoặc quan hệ giữa các khái niệm cấu thành chương trình. –

+10

@Carl Smotricz: * "Nó giống như hệ thống kiểu của Haskell với Java được khởi động như một ngôn ngữ kịch bản." * ... đó có thể là điều đáng sợ nhất mà tôi từng nghe. :) –

2

Học ngôn ngữ chức năng sẽ thay đổi hoàn toàn so với những gì bạn thường sử dụng. Vì vậy, có, bạn có thể sẽ học cái gì đó hữu ích;)

+1

Điều này không may là chính xác loại câu trả lời mà OP không muốn :) –

15

Tôi cũng không nghĩ rằng tôi có thể dễ dàng cắm một đoạn mã Haskell vào công cụ trò chơi.

Nếu bạn chỉ muốn viết công cụ trò chơi 3D thì có thể không có nhiều điểm trong việc học Haskell.

Nếu bạn muốn trở thành một lập trình viên toàn diện có khả năng lập trình theo nhiều mô hình và hiện tại bạn chỉ biết các ngôn ngữ giống như C thì nó đáng để xem.

Mỗi khi bạn học một ngôn ngữ mới khác, nó giúp việc học ngôn ngữ tiếp theo dễ dàng hơn vì bạn không chỉ ghi nhớ cú pháp mới, bạn còn học các cách nghĩ khác nhau về lập trình. Nếu bạn thử một ngôn ngữ mới và bạn thấy một số tính năng mới, bạn sẽ hiểu nhanh hơn nếu bạn có thể liên kết nó với một tính năng khác bằng ngôn ngữ bạn đã biết. Càng nhiều ngôn ngữ bạn biết càng có nhiều khả năng là tính năng mới này tương tự như một cái gì đó bạn đã thấy trước đây.

Cũng tiện dụng khi có nhiều công cụ có sẵn trong hộp công cụ của bạn. Một số vấn đề được giải quyết tốt hơn bằng ngôn ngữ này so với ngôn ngữ khác. Nếu bạn có 5 loại ngôn ngữ khác nhau thì bạn có thể chọn ngôn ngữ tốt nhất cho từng vấn đề. Nếu bạn chỉ biết 2 hoặc 3 ngôn ngữ rất giống nhau thì một số vấn đề sẽ dễ giải quyết, nhưng những vấn đề khác có thể khó khăn hơn nếu bạn sử dụng một ngôn ngữ tốt hơn ở nhiệm vụ cụ thể đó.

1

Các ngôn ngữ chức năng như Haskell là một cách suy nghĩ khác về một vấn đề. Chúng rất hữu ích cho việc học và dạy các cấu trúc dữ liệu và các thuật toán, vì chúng đơn giản hóa các loại vấn đề đó.

Nếu bạn sử dụng STL từ C++, có khái niệm chức năng tương tự như Haskell và các ngôn ngữ khác, do đó có nền tảng trong Haskell sẽ giúp hiểu cách hoạt động của STL.

Nếu bạn sử dụng XSL: T để chuyển đổi XML, điều đó rất có chức năng trong thiết kế của nó.

+1

Tôi đoán bạn nhầm lẫn "chức năng" với "khai báo".XSLT không có chức năng đặt hàng đầu tiên, phải không? –

4

Có một số điều bạn có thể nhận được, chủ yếu theo cách bạn nghĩ về mọi thứ. Ví dụ, nó là thú vị để thông báo những gì một ngôn ngữ tối thiểu là. Nếu bạn đi qua SICP (và các khái niệm tương tự cũng áp dụng cho Haskell), bạn sẽ thấy cách bạn không cần cú pháp vòng lặp nào cả. Bạn không cần bất kỳ hàm được xác định trước nào hoạt động trên các cấu trúc lớn hơn. Bạn có thể xác định khá nhiều mọi thứ bạn cần nếu bạn được cung cấp một constructor/deconstructor đối lập, hoặc một cách để định nghĩa một và khả năng để recurse functions. Bạn có thể tự định nghĩa mọi thứ khác - và đó là một bài tập thú vị để làm như vậy. Và đây chỉ là đỉnh của tảng băng trôi.

Trên một mức độ thực tế hơn, ví dụ, một vài tuần trước, tôi đã làm bài tập về nhà OCaml và rên rỉ "tại sao ngôn ngữ $% $% # này không có call/cc!?!" Tâm trí tôi bị thổi khi tôi nhận ra điều tôi đang nghĩ - tôi sẽ không bao giờ bỏ lỡ nếu tôi không biết nó là gì, và tôi sẽ không biết nó là gì nếu tôi không nhìn vào Đề án, Haskell, Ruby.

Bạn có thể tìm thấy nhiều ví dụ hay tại cuộc thi ICFP; người thực sự làm tôi kinh ngạc là this entry tại this contest. Họ đã tạo ra một ngôn ngữ mới bên trong Haskell để giải quyết vấn đề của họ.

+0

+1 cho tính năng ngôn ngữ mà bạn thèm muốn nhưng không thể có. Vô minh là phúc lạc, vì vậy chỉ học một ngôn ngữ lập trình và quên hết mọi thứ khác. Họ sẽ taint tâm trí của bạn với những ý tưởng của tội lỗi nhưng không thể sử dụng! –

40

Một vài năm trước, một cô gái xinh đẹp trong bộ phận của chúng tôi đã quyết định học Khoa học Máy tính bán thời gian. Nhiều người ngạc nhiên khi khám phá ra một trong những khóa học giới thiệu đang được dạy bằng cách sử dụng Haskell như một ngôn ngữ lập trình! Mặc dù tôi không có kinh nghiệm với Haskell, tôi đã có một số nền tảng trong Lisp và các ngôn ngữ lập trình chức năng khác và có thể giúp cô ấy tập công.

Không, không có kết thúc hạnh phúc cho câu chuyện này: Cô ấy bỏ học, kết hôn với người khác và tôi đã không gặp cô ấy trong một thời gian dài. Nhưng tôi nghĩ giai thoại cho thấy kiến ​​thức có thể hữu ích như thế nào khi bạn ít mong đợi nó nhất.


Trên thực tế hơn: Bạn có thể nhận thấy rằng tốc độ CPU nhấn một bức tường cách đây vài năm, và bây giờ là cách thiết thực nhất để kéo hiệu suất hơn từ các máy tính là bằng cách cài đặt nhiều CPU. Bây giờ nó sẽ xảy ra rằng hầu hết nếu không phải tất cả các ngôn ngữ lập trình bạn biết về cơ bản là đơn nhiệm vụ, và tùy thuộc vào Von Neumann bottleneck. Một giải pháp rõ ràng là lập trình song song, nhưng điều đó có thể rất đau đớn nếu các phần song song của chương trình của bạn kết thúc chia sẻ trạng thái, tức là bộ nhớ - và điều này thường xảy ra nhất.

Nó chỉ ra rằng lập trình chức năng là một phong cách cho phép bạn chủ yếu là phá vỡ các vấn đề lập trình song song với trạng thái chia sẻ. Nói một cách khác nhau, nó khá dễ dàng để viết các chương trình theo phong cách FP là "tự nhiên" thread an toàn và phù hợp cho xử lý song song. Tùy thuộc vào ngôn ngữ, trình biên dịch và phần cứng bạn thậm chí có thể tìm thấy (như tôi đã làm gần đây) các phần của chương trình của bạn chạy song song mà không bao giờ thực hiện bất kỳ mã hóa rõ ràng nào cho tính song song.

Tôi thường sai, nhưng tôi đoán là Lập trình chức năng sẽ trở thành một trong những mô hình lập trình nóng của tương lai khi lập trình song song trở nên quan trọng và khó khăn hơn. Haskell có thể không trở thành ngôn ngữ được lựa chọn - yêu thích cá nhân của tôi hiện là Clojure - nhưng cũng có thể đáng để xem một hoặc nhiều ngôn ngữ FP.

8

Nếu lập trình 3D là điều của bạn, bạn có thể quan tâm đến một số trang trình bày từ một cuộc trò chuyện có tên là The Next Mainstream Programming Languages: A Game Developer's Perspective bởi Tim Sweeney, người sáng lập Epic và giám đốc kỹ thuật cho động cơ Unreal. Anh ấy đã nói về chủ đề multiple times, và anh ấy rõ ràng nghĩ rất cao về Haskell.

+2

Rất thú vị, cảm ơn liên kết! –

2

Tôi sẽ nói, nếu đó là việc vặt thì không làm. Nếu không, hãy bắt đầu đọc this và bạn sẽ thấy sau 10 mn nếu bạn đang buồn chán hoặc nếu bạn bị nắm chặt và không thể ngừng đọc nó.

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