Haskell được sử dụng để làm gì trong thế giới thực? [đóng cửa]


475

Có rất nhiều sự cường điệu xung quanh Haskell, tuy nhiên, thật khó để có được thông tin về cách nó được sử dụng trong các ứng dụng trong thế giới thực. Các dự án / tập quán phổ biến nhất của Haskell là gì và tại sao nó vượt trội trong việc giải quyết những vấn đề này?


56
Không, tôi sẽ không vì đó là một câu trả lời rõ ràng. Không có phòng ngọ nguậy cho ý kiến ​​và như vậy. Tôi chỉ muốn biết ngôn ngữ được tạo ra để làm gì.
Sergio Tapia


12
@ Papuccino1, chờ đã, bạn có muốn biết nó hữu ích cho cái gì không, hay nó được tạo ra để làm gì? Câu hỏi trước đây là những gì câu hỏi đang hỏi, và có rất nhiều ý kiến ​​cho rằng ...
bdonlan

3
@ Papuccino1 - Những từ thêm trong tiêu đề của bạn mang lại lợi ích gì cho câu hỏi? Ngoài ra, tôi nghĩ rằng bạn đang hiểu nhầm việc sử dụng thuật ngữ "chức năng" trong ngữ cảnh này, nhưng thật khó để nói.
Chris Lutz

2
Theo trang web riêng của họ, nhiều công ty sử dụng nó cho các mục đích khác nhau ... haskell.org/haskellwiki/Haskell_in_industry
Julian

Câu trả lời:


309

Một số sử dụng phổ biến cho ngôn ngữ này là gì?

Phát triển ứng dụng nhanh chóng.

Nếu bạn muốn biết "tại sao Haskell?", Thì bạn cần xem xét lợi thế của các ngôn ngữ lập trình chức năng (lấy từ https://c2.com/cgi/wiki?AdvantagesOfFeftalProgramming ):

  • Các chương trình chức năng có xu hướng ngắn gọn hơn nhiều so với các đối tác ngôn ngữ bắt buộc. Thông thường, điều này dẫn đến tăng năng suất lập trình viên

  • FP khuyến khích tạo mẫu nhanh. Như vậy, tôi nghĩ đó là mô hình thiết kế phần mềm tốt nhất cho ExtremeProgrammer ... nhưng tôi biết gì?

  • FP là mô-đun theo chiều của chức năng, trong đó ObjectOrientsProgramming là mô-đun theo chiều của các thành phần khác nhau.

  • Khả năng có bánh của bạn và ăn nó. Hãy tưởng tượng bạn có một thông báo xử lý hệ thống OO phức tạp - mọi thành phần có thể thay đổi trạng thái tùy thuộc vào tin nhắn và sau đó chuyển tiếp tin nhắn đến một số đối tượng mà nó có liên kết. Sẽ không quá tuyệt để có thể dễ dàng khôi phục mọi thay đổi nếu một số đối tượng nằm sâu trong hệ thống phân cấp cuộc gọi quyết định tin nhắn bị sai sót? Làm thế nào về việc có một lịch sử của các tiểu bang khác nhau?

  • Nhiều nhiệm vụ vệ sinh được thực hiện cho bạn: giải cấu trúc cấu trúc dữ liệu (PatternMatching), lưu trữ các ràng buộc biến (LexicalScope có bao đóng), gõ mạnh (TypeInference), GarbageCollection, phân bổ lưu trữ, cho dù sử dụng trực tiếp theo hộp (con trỏ đến giá trị) ) đại diện ...

  • Đa luồng an toàn! Các cấu trúc dữ liệu không thay đổi không phải tuân theo các điều kiện chạy dữ liệu và do đó không phải bảo vệ bằng các khóa. Nếu bạn luôn phân bổ các đối tượng mới, thay vì thao túng triệt để các đối tượng hiện có, khóa có thể bị ẩn trong hệ thống phân bổ và GarbageCollection.

Ngoài Haskell này có những ưu điểm riêng như:

  • Rõ ràng, cú pháp trực quan lấy cảm hứng từ ký hiệu toán học.
  • Liệt kê danh sách để tạo một danh sách dựa trên danh sách hiện có.
  • Biểu thức Lambda: tạo hàm mà không cho chúng tên rõ ràng. Vì vậy, nó dễ dàng hơn để xử lý các công thức lớn.
  • Haskell là hoàn toàn tham chiếu minh bạch . Bất kỳ mã nào sử dụng I / O phải được đánh dấu như vậy. Bằng cách này, nó khuyến khích bạn tách mã bằng các tác dụng phụ (ví dụ: đặt văn bản trên màn hình) khỏi mã mà không cần (tính toán).
  • Đánh giá lười biếng là một tính năng thực sự tốt đẹp:
    • Ngay cả khi một cái gì đó thường gây ra lỗi, nó vẫn sẽ hoạt động miễn là bạn không sử dụng kết quả. Ví dụ: bạn có thể đặt 1 / 0làm mục đầu tiên của danh sách và nó sẽ vẫn hoạt động nếu bạn chỉ sử dụng mục thứ hai.
    • Việc viết các chương trình tìm kiếm như bộ giải sudoku này sẽ dễ dàng hơn vì nó không tải mọi kết hợp cùng một lúc mà nó chỉ tạo ra chúng khi nó đi cùng. Bạn có thể làm điều này bằng các ngôn ngữ khác, nhưng chỉ có Haskell làm điều này theo mặc định .

Bạn có thể kiểm tra các liên kết sau:


20
Ý nghĩ sau đây thường xuyên xuất hiện trong đầu tôi: trong một ngôn ngữ thuần túy, một hàm luôn trả về cùng một kết quả khi được truyền cùng các tham số. Đây là một sự đảm bảo. Các ngôn ngữ bắt buộc ngược lại xây dựng mọi thứ trên đầu "tuyên bố". Một tuyên bố không đi kèm với bất kỳ loại bảo lãnh nào (ngoại trừ việc thực thi nó tiêu tốn thời gian và sinh nhiệt). Vì vậy, nền tảng đã bị lung lay và mọi thứ khó khăn trên nó sẽ vẫn còn run rẩy. Đối với tôi đây là một trong những lý do để học haskell.
Martin Drautzburg

8
Đã 6 năm kể từ khi câu hỏi này được hỏi và kể từ khi ngôn ngữ lập trình Go ra mắt. Mặc dù có hệ thống loại yếu hơn và thường "kém khách quan" (theo người hâm mộ chức năng / ML), nhưng nó đã quản lý để vận chuyển phần mềm (và quan trọng hơn) trong 6 năm so với Haskell trong 26 năm. Tôi có nghĩa là đây là một trường hợp nghiên cứu; rõ ràng có những thứ đang giữ các ngôn ngữ chức năng trở lại, và tất cả chúng không thể được quy cho sự cường điệu.
weberc2

3
Bạn đã quên một điểm - mã hóa trong haskell là một vụ nổ tuyệt đối;) Tôi đã có rất nhiều niềm vui khi thử sức mình với một số vấn đề trong haskell.
J Atkin

8
@MartinDrautzburg Tất nhiên báo cáo đi kèm với đảm bảo. Những loại ngôn ngữ hữu ích sẽ có tuyên bố mà không có bảo đảm? Ví dụ trong C x = 5;đảm bảo rằng sau khi nó thực thi, xchứa giá trị 5.
dùng253751

5
@ E4z9 Vâng, nhưng trong C ++, nó đảm bảo operator =được gọi là. Và nó đảm bảo điều gì sẽ xảy ra nếu bạn không xác địnhoperator =
user253751

234

Tôi nghĩ mọi người trong bài viết này đang thiếu điểm quan trọng nhất đối với bất kỳ ai chưa bao giờ sử dụng ngôn ngữ lập trình chức năng: mở rộng tâm trí của bạn. Nếu bạn chưa quen với lập trình chức năng thì Haskell sẽ khiến bạn suy nghĩ theo những cách bạn chưa từng nghĩ trước đây. Kết quả là chương trình của bạn trong các lĩnh vực khác và các ngôn ngữ khác sẽ được cải thiện. Bao nhiêu? Khó định lượng.


2
Tôi đang sử dụng iPhone, Mac. Haskell được sử dụng ở đâu? Ý tôi là đối với các ứng dụng tôi đã sử dụng, chúng được viết bằng Objective-C hoặc Swift + một cái gì đó cho cơ sở dữ liệu và máy chủ. Swift cũng có thể là chức năng. Vì vậy, một lần nữa tôi lại bối rối không biết nó được sử dụng ở đâu
Honey

2
Facebook thực hiện phát hiện SPAM với nó: code.facebook.com/posts/745068642270222/NH
Alex

25
Câu trả lời này, được viết bằng một giọng điệu khác, nói rằng Haskell là một bài tập tuyệt vời cho một lập trình viên, mà IMO không tạo ra một ngôn ngữ có mục đích chung tuyệt vời
Passer By

5
Tại Keera Studios, chúng tôi viết các ứng dụng và trò chơi iOS và Android bằng Haskell.
Ivan Perez

1
Tôi hoàn toàn đồng ý với điều này. Tôi đã viết rất nhiều mã trong nhiều thập kỷ bằng các ngôn ngữ bắt buộc. Tôi đã khám phá Haskell trong một vài tháng và điều đó đã mở ra suy nghĩ của tôi về những điều mà tôi chưa từng nghĩ đến trước đây.
Adahus

87

Có một câu trả lời tốt cho những gì một ngôn ngữ có mục đích chung như Haskell là tốt cho: viết chương trình nói chung.

Đối với những gì nó được sử dụng trong thực tế, tôi có ba cách tiếp cận để thiết lập rằng:

Chỉ ra rằng nó tốt cho đồ họa, mạng, lập trình hệ thống, cấu trúc dữ liệu, cơ sở dữ liệu, phát triển, xử lý văn bản ...

Và cuối cùng, ý kiến ​​của tôi về những gì nó thực sự mạnh mẽ:

Tôi hy vọng điều đó mang lại cho bạn cảm giác về câu hỏi của bạn rộng đến mức nào, nếu nó được trả lời với bất kỳ sự cụ thể nào.


15
Thẻ đám mây bị hỏng
Elliot Cameron

đám mây thẻ được tạo bằng wordcloud ?
Janus Troelsen

29

Một ví dụ về Haskell đang hoạt động là xmonad , một "trình quản lý cửa sổ đặc trưng với ít hơn 1200 dòng mã".


18

Từ Wiki Haskell :

Haskell có phạm vi sử dụng đa dạng về mặt thương mại, từ hàng không vũ trụ và quốc phòng, đến tài chính, cho đến các công ty khởi nghiệp web, các công ty thiết kế phần cứng và các nhà sản xuất máy cắt cỏ. Trang này thu thập các tài nguyên về sử dụng công nghiệp của Haskell.

Theo Wikipedia, ngôn ngữ Haskell được tạo ra do nhu cầu hợp nhất các ngôn ngữ chức năng hiện có thành ngôn ngữ chung có thể được sử dụng cho nghiên cứu trong tương lai trong thiết kế ngôn ngữ chức năng.

Rõ ràng dựa trên thông tin có sẵn rằng nó đã vượt xa mục đích ban đầu của nó và được sử dụng cho nhiều hơn là nghiên cứu. Bây giờ nó được coi là một ngôn ngữ lập trình chức năng mục đích chung.

Nếu bạn vẫn tự hỏi: "Tại sao tôi nên sử dụng nó?", Sau đó đọc Tại sao nên sử dụng nó? phần Giới thiệu Wiki của Haskell.


13

Haskell là một ngôn ngữ lập trình mục đích chung. Nó có thể được sử dụng cho bất cứ điều gì bạn sử dụng bất kỳ ngôn ngữ khác để làm. Bạn không bị giới hạn bởi bất cứ điều gì ngoại trừ trí tưởng tượng của riêng bạn. Đối với những gì nó phù hợp cho? Chà, khá nhiều thứ. Có một vài nhiệm vụ trong đó một ngôn ngữ chức năng không vượt trội.

Và vâng, tôi là Rayne từ Dreamincode. :)

Tôi cũng muốn đề cập rằng, trong trường hợp bạn chưa đọc trang Wikipedia, lập trình chức năng là một mô hình giống như lập trình hướng đối tượng là một mô hình. Chỉ trong trường hợp bạn không biết. Haskell cũng có chức năng theo nghĩa là nó hoạt động; nó hoạt động khá tốt ở đó

Chỉ vì một ngôn ngữ không phải là ngôn ngữ hướng đối tượng không có nghĩa là ngôn ngữ bị giới hạn bởi bất cứ điều gì. Haskell là một ngôn ngữ lập trình có mục đích chung và cũng có mục đích chung như Java.


9

Tôi có một điều thú vị, facebook đã tạo ra một công cụ tự động để viết lại mã PHP. Họ phân tích nguồn thành một cây cú pháp trừu tượng, thực hiện một số biến đổi:

if ($f == false) -> if (false == $f)

Tôi không biết tại sao, nhưng đó dường như là phong cách đặc biệt của họ và sau đó họ in nó ra.

https://github.com/facebook/lex-pass

Chúng tôi sử dụng haskell để tạo các ngôn ngữ cụ thể cho tên miền nhỏ. Số lượng lớn xử lý dữ liệu. Phát triển web. Nhện web. Ứng dụng thử nghiệm. Viết kịch bản quản trị hệ thống. Kịch bản cuối cùng, mà giao tiếp với các bên khác. Các tập lệnh giám sát (chúng tôi có DSL hoạt động độc đáo cùng với munin, giúp viết mã màn hình chính xác cho các ứng dụng của bạn dễ dàng hơn nhiều).

Tất cả các loại công cụ thực sự. Nó chỉ là một ngôn ngữ có mục đích chung hàng ngày với một số tính năng rất mạnh mẽ và hữu ích, nếu bạn hơi nghiêng về mặt toán học.


6
Re: kiểu FB, đặt sai trước == có nghĩa là nếu bạn quên và chỉ viết một ký tự = thì hành vi kết quả sẽ rõ ràng hơn thay vì âm thầm thực hiện một thao tác chuyển nhượng ngoài ý muốn và tiếp tục bình thường
Magnus

Thật là thông minh, lực lượng của bạn đặc biệt là lỗi được biết đến thời gian biên dịch sau đó.
Edgar Klerks

@EdgarKlerks, PHP không có thời gian biên dịch. Điều này buộc ngoại lệ phải được nêu ra ở chỗ sai lầm, thay vì dẫn đến hành vi kỳ quái hoặc lỗi trong mã xa.
dfeuer

Mặc dù tôi thấy lợi ích của việc viết falseở bên trái, tôi không thấy mục đích của việc sử dụng một công cụ để thực hiện nó một cách tự động: nếu bạn đã có một ==nhà điều hành thì bạn đã biết bạn không có lỗi đó là một phần của lex-pass có nghĩa là để bắt và nếu bạn có một =thay vào đó, không có cách nào chắc chắn để biết liệu nó có cố tình như vậy hay không.
Danh sách Jeremy

1
@JeremyList Có lẽ họ thực sự nghiêm ngặt về phong cách mã hóa. Tôi có thể thấy rằng mã được định dạng gọn gàng mời viết mã được định dạng gọn gàng hơn. Chỉ là một phỏng đoán hoang dã.
Edgar Klerks

6

Từ Haskell :

Haskell là một ngôn ngữ lập trình chức năng hoàn toàn tiêu chuẩn hóa, đa mục đích , với ngữ nghĩa không nghiêm ngặt và gõ tĩnh mạnh mẽ. Nó được đặt theo tên của nhà logic học Haskell Curry.

Về cơ bản Haskell có thể được sử dụng để tạo ra khá nhiều thứ bạn thường tạo bằng các ngôn ngữ có mục đích chung khác (ví dụ: C #, Java, C, C ++, v.v.).


5

Ví dụ: để phát triển các ứng dụng web HTML5 tương tác, thời gian thực. Xem Elm , trình biên dịch được triển khai trong Haskell và cú pháp mượn rất nhiều từ Haskell.


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.