Tại sao ngôn ngữ chức năng? [đóng cửa]


332

Tôi thấy rất nhiều cuộc nói chuyện ở đây về ngôn ngữ chức năng và công cụ. Tại sao bạn lại sử dụng một ngôn ngữ "truyền thống"? Họ làm gì tốt hơn? Họ tệ hơn ở cái gì? Ứng dụng lập trình chức năng lý tưởng là gì?


John Hughes đã viết một bài báo về điều này: Tại sao các vấn đề lập trình chức năng .
Hjulle

Câu trả lời:


214

Các ngôn ngữ chức năng sử dụng một mô hình khác với các ngôn ngữ bắt buộc và hướng đối tượng. Họ sử dụng các chức năng không có tác dụng phụ như một khối xây dựng cơ bản trong ngôn ngữ. Điều này cho phép nhiều thứ và làm cho nhiều thứ trở nên khó khăn hơn (hoặc trong hầu hết các trường hợp khác với những gì mọi người đã quen).

Một trong những lợi thế lớn nhất với lập trình chức năng là thứ tự thực hiện các chức năng không có tác dụng phụ là không quan trọng. Ví dụ, trong Erlang, điều này được sử dụng để cho phép đồng thời một cách rất minh bạch. Và bởi vì các hàm trong các ngôn ngữ chức năng hoạt động rất giống với các hàm toán học, thật dễ dàng để dịch chúng sang các ngôn ngữ chức năng. Trong một số trường hợp, điều này có thể làm cho mã dễ đọc hơn.

Theo truyền thống, một trong những nhược điểm lớn của lập trình chức năng cũng là thiếu tác dụng phụ. Rất khó để viết phần mềm hữu ích mà không có IO, nhưng IO khó thực hiện nếu không có tác dụng phụ trong các chức năng. Vì vậy, hầu hết mọi người không bao giờ nhận được nhiều hơn từ lập trình chức năng hơn là tính toán một đầu ra từ một đầu vào duy nhất. Trong các ngôn ngữ mô hình hỗn hợp hiện đại như F # hoặc Scala, điều này dễ dàng hơn.

Rất nhiều ngôn ngữ hiện đại có các yếu tố từ các ngôn ngữ lập trình chức năng. C # 3.0 có nhiều tính năng lập trình chức năng và bạn cũng có thể lập trình chức năng trong Python. Tôi nghĩ rằng lý do cho sự phổ biến của lập trình chức năng chủ yếu là vì hai lý do: Đồng thời đang trở thành một vấn đề thực sự trong lập trình thông thường bởi vì chúng ta ngày càng có nhiều máy tính đa bộ xử lý; và các ngôn ngữ đang trở nên dễ tiếp cận hơn.


14
Bạn CÓ THỂ lập trình chức năng trong python, nhưng nó thực sự khủng khiếp. stackoverflow.com/questions/1017621/ trộm
Gordon Gustafson

28
không khó để viết mã IO bằng các ngôn ngữ chức năng thuần túy. Tất cả đều cung cấp một cơ chế đơn giản để viết mã IO hoạt động giống như trong các ngôn ngữ bắt buộc. Tất cả những gì họ làm là thực thi rằng bạn không thể gọi mã IO bên trong mã khác có giao diện được khai báo là không thực hiện IO. Một sự tương tự sẽ là một lập trình viên ngôn ngữ động phàn nàn rằng một ngôn ngữ được gõ tĩnh như Java khiến bạn khó có thể trả về bất kỳ loại nào cô ấy muốn từ một phương thức, bởi vì cô ấy phải trả về bất cứ điều gì khai báo kiểu sẽ trả về.
Ben

9
Haskell là một ví dụ về ngôn ngữ chức năng thuần túy, không có nhược điểm như bạn đã nói. Nó thực sự làm cho việc xử lý các tác dụng phụ trở nên dễ dàng hơn nhiều, bởi vì các tác dụng phụ được gói gọn và cho phép lập trình viên đạt được mức độ trừu tượng mạnh hơn nhiều so với các ngôn ngữ bắt buộc ... Thực sự, mọi người nên thử Haskell, thực sự nắm bắt và nhận ra tại sao nó rất mạnh
FtheBuilder

202

Tôi không nghĩ rằng có bất kỳ câu hỏi nào về cách tiếp cận chức năng để lập trình "bắt kịp", bởi vì nó đã được sử dụng (như một phong cách lập trình) trong khoảng 40 năm. Bất cứ khi nào một lập trình viên OO viết mã sạch ủng hộ các đối tượng bất biến, mã đó sẽ mượn các khái niệm chức năng.

Tuy nhiên, những ngôn ngữ thực thi một phong cách chức năng đang nhận được rất nhiều mực ảo trong những ngày này, và liệu những ngôn ngữ đó sẽ trở nên chiếm ưu thế trong tương lai hay không là một câu hỏi mở. Sự nghi ngờ của tôi là các ngôn ngữ lai, đa mô hình như Scala hoặc OCaml có thể sẽ chiếm ưu thế đối với các ngôn ngữ chức năng "thuần túy" theo cùng cách mà ngôn ngữ OO thuần túy (Smalltalk, Beta, v.v.) đã ảnh hưởng đến lập trình chính thống nhưng vẫn chưa kết thúc lên như các ký hiệu được sử dụng rộng rãi nhất.

Cuối cùng, tôi không thể cưỡng lại việc chỉ ra rằng các bình luận của bạn là FP rất song song với những nhận xét mà tôi đã nghe từ các lập trình viên thủ tục cách đây không nhiều năm:

  • Lập trình viên "trung bình", huyền thoại, IMHO) không hiểu điều đó.
  • Nó không được dạy rộng rãi.
  • Bất kỳ chương trình nào bạn có thể viết với nó đều có thể được viết theo cách khác với các kỹ thuật hiện tại.

Cũng giống như giao diện người dùng đồ họa và "mã như một mô hình của doanh nghiệp" là những khái niệm giúp OO được đánh giá cao hơn, tôi tin rằng việc sử dụng song song (đơn giản) tăng cường sẽ giúp nhiều lập trình viên thấy được lợi ích mà phương pháp chức năng mang lại . Nhưng nhiều như chúng ta đã học được trong hơn 50 năm qua tạo nên toàn bộ lịch sử lập trình máy tính kỹ thuật số, tôi nghĩ chúng ta vẫn còn nhiều điều phải học. Hai mươi năm nữa, các lập trình viên sẽ nhìn lại sự kinh ngạc về bản chất nguyên thủy của các công cụ chúng ta hiện đang sử dụng, bao gồm các ngôn ngữ OO và FP phổ biến hiện nay.


55
Chỉ cần nhìn lại 20 năm. Tôi không lập trình điều đã phát triển nhiều. Cũng có các công cụ tốt hơn, có thể là một ngôn ngữ mới hoặc 2 nhưng về cơ bản sẽ không có nhiều thay đổi. Điều này sẽ mất hơn 20 năm. Tất cả chúng ta từng nghĩ rằng chúng ta sẽ thấy những chiếc ô tô bay vào năm 2000. :)
bibac

32
O'Caml là người Ailen.
defmeta

7
@alex lạ: "Ưu tiên bất biến" và "tránh tác dụng phụ" đã là những quy tắc tốt trong một thời gian dài ở cả hai trường lập trình hướng đối tượng và mệnh lệnh. (Vì vậy, những gì không thích? ;-)
joel.neely

101
@bibac: 20 năm trước chúng tôi đã viết mã C và thảo luận về giá trị của Clipper hoặc Turbo Pascal. Định hướng đối tượng là lĩnh vực độc quyền của các học giả. Đề xuất rằng ít thay đổi là hết sức vô lý.
Daniel C. Sobral

24
@Daniel: Vui lòng cung cấp danh sách những người tranh luận về "công trạng" của Clipper. Họ cần phải bị săn lùng và đưa ra công lý.
David

125

Điểm cộng chính đối với tôi là tính song song vốn có của nó, đặc biệt là khi chúng ta đang di chuyển ra xa nhiều MHz hơn và hướng tới ngày càng nhiều lõi.

Tôi không nghĩ nó sẽ trở thành mô hình lập trình tiếp theo và thay thế hoàn toàn các phương thức loại OO, nhưng tôi nghĩ chúng ta sẽ hiểu được rằng chúng ta cần phải viết một số mã bằng ngôn ngữ chức năng hoặc ngôn ngữ mục đích chung của chúng ta sẽ phát triển để bao gồm các cấu trúc chức năng hơn.


4
Chúng tôi đã thấy điều này xảy ra. Và nó sẽ xảy ra nhiều hơn trong tương lai. Vì vậy, tôi đồng ý 100% về điểm này.
Jason Baker

Điều khó khăn là đó là những khía cạnh không có gì được chia sẻ / không có tác dụng phụ của FP khiến nó rất phù hợp với sự song song. Và đó là những khía cạnh không phù hợp với các giải pháp OO - làm cho các giống lai hiệu quả là vô cùng khó khăn. Có lẽ keo dán giữa các nút OO?
James Brady

Để có một phép lai hiệu quả, hãy xem nhánh 2.0 của ngôn ngữ lập trình D. Đó là một bản alpha / công việc đang tiến triển, nhưng nó đang đến đó.
dsimcha

2
Tôi thấy câu trả lời này thú vị, tôi không biết bất kỳ ngôn ngữ chức năng nào, tại sao chúng được coi là phù hợp hơn cho song song?
andandandand

26
Vì không có dữ liệu chia sẻ, các chức năng không có tác dụng phụ. Tất cả những gì bạn quan tâm là giá trị trả lại. (Đây là một ý tưởng khá khó đối với một lập trình viên OO / thủ tục để có được vòng đầu của cô ấy.) Nhiều chức năng có thể được gọi cùng một lúc, miễn là đầu ra từ cái này không được sử dụng làm đầu vào cho cái khác.
Tom Smith

79

Ngay cả khi bạn không bao giờ làm việc trong một ngôn ngữ chức năng một cách chuyên nghiệp, hiểu được lập trình chức năng sẽ giúp bạn trở thành một nhà phát triển tốt hơn. Nó sẽ cung cấp cho bạn một quan điểm mới về mã và lập trình của bạn nói chung.

Tôi nói không có lý do để không học nó.

Tôi nghĩ rằng các ngôn ngữ làm tốt công việc pha trộn phong cách chức năng và mệnh lệnh là thú vị nhất và có nhiều khả năng thành công nhất.


Điểm hay, nhưng tôi muốn xem một lời giải thích về "bằng cách nào nó sẽ giúp bạn trở thành một nhà phát triển tốt hơn"
mt3

20
Các mô hình lập trình khác nhau tiếp cận các vấn đề từ các góc độ khác nhau và thường đòi hỏi một "cách suy nghĩ khác nhau" hoặc suy nghĩ. Và rèn luyện bản thân theo nhiều cách suy nghĩ khác nhau (ngụ ý học cách sử dụng cái nào trong tình huống nào ...) không bao giờ là điều xấu.
peSHIr

56

Tôi luôn hoài nghi về điều lớn tiếp theo. Rất nhiều lần Next Big Thing là tai nạn thuần túy của lịch sử, có mặt đúng nơi, đúng thời điểm cho dù công nghệ có tốt hay không. Ví dụ: C ++, Tcl / Tk, Perl. Tất cả các công nghệ thiếu sót, tất cả đều thành công rực rỡ bởi vì chúng được coi là để giải quyết các vấn đề trong ngày hoặc gần giống với các tiêu chuẩn cố thủ, hoặc cả hai. Lập trình chức năng có thể thực sự tuyệt vời, nhưng điều đó không có nghĩa là nó sẽ được thông qua.

Nhưng tôi có thể cho bạn biết lý do tại sao mọi người hào hứng với lập trình chức năng: nhiều, nhiều lập trình viên đã có một loại "trải nghiệm chuyển đổi" trong đó họ phát hiện ra rằng sử dụng ngôn ngữ chức năng giúp họ làm việc hiệu quả gấp đôi (hoặc có thể gấp mười lần năng suất) trong khi sản xuất mã có khả năng phục hồi tốt hơn để thay đổi và có ít lỗi hơn. Những người này nghĩ về lập trình chức năng như một vũ khí bí mật; một ví dụ điển hình cho suy nghĩ này là Beating the A Average của Paul Graham . Oh, và ứng dụng của mình? Ứng dụng web thương mại điện tử.

Từ đầu năm 2006 cũng đã có một số tiếng vang về lập trình chức năng và song song. Vì những người như Simon Peyton Jones đã lo lắng về sự song song và kể từ ít nhất là năm 1984, tôi không nín thở cho đến khi các ngôn ngữ chức năng giải quyết vấn đề đa lõi. Nhưng nó giải thích một số buzz bổ sung ngay bây giờ.

Nhìn chung, các trường đại học Mỹ đang làm một công việc kém dạy lập trình chức năng. Có một lõi hỗ trợ mạnh mẽ cho việc dạy lập trình giới thiệu bằng Scheme và Haskell cũng thích một số hỗ trợ ở đó, nhưng có rất ít cách dạy kỹ thuật nâng cao cho lập trình viên chức năng. Tôi đã dạy một khóa học như vậy tại Harvard và sẽ thực hiện lại vào mùa xuân này tại Tufts. Benjamin Pierce đã dạy một khóa học như vậy tại Penn. Tôi không biết Paul Hudak có làm gì ở Yale không. Các trường đại học châu Âu đang làm một công việc tốt hơn nhiều; ví dụ, lập trình chức năng được nhấn mạnh ở những nơi quan trọng ở Đan Mạch, Hà Lan, Thụy Điển và Vương quốc Anh. Tôi ít có ý thức về những gì đang xảy ra ở Australasia.


Tôi không biết về các trường đại học Vương quốc Anh. Bạn có nhiều khả năng thấy rằng nhiều trường đại học ở đây dạy rất ít ngôn ngữ lập trình (Java, C, có thể là Perl nếu bạn may mắn). Vấn đề ở đây là sự khác biệt về chất lượng, vì các trường đại học tốt nhất (ít) có chương trình CS tốt nhất.
Mike B

Tôi không đồng ý các ví dụ bạn đưa ra là thiếu sót, có lẽ thích hợp hoặc phù hợp với một số lĩnh vực nhất định, nhưng mục đích chung đủ để được đưa lên toàn cầu mà không cần một đường cong học tập lớn. đó có lẽ là lý do lớn nhất khiến họ thành công
gbjbaanb

Tôi đã làm Forth và Lisp tại uni ở Anh (cũng như Pascal, C, Modula2 và Cobol) nhưng đó là 20 năm trước ..
kpollock

29
Tôi đã được dạy Java / C ++ tại uni (ở Úc), nhưng một số đồng nghiệp của tôi đã đến các trường đại học khác nhau nơi họ đã làm một số đơn vị ở Haskell. Nó được sử dụng cho cả phần giới thiệu để lập trình và một trong những đơn vị năm cuối của họ. Tôi đã cười khi nghe những gì đồng nghiệp của tôi nói với một giảng viên Java sau khi anh ta được giới thiệu lần đầu tiên (lúc này anh ta chỉ biết Haskell) - "Cái gì?! T BIẾT nó là loại gì?! "
Jacob Stanley

1
Hãy nhìn vào những gì đã xảy ra với C # với tất cả những người châu Âu trong đội :)
Stewol

32

Tôi không thấy ai nhắc đến con voi trong phòng ở đây, vì vậy tôi nghĩ nó tùy thuộc vào tôi :)

JavaScript là một ngôn ngữ chức năng. Khi ngày càng có nhiều người làm những điều nâng cao hơn với JS, đặc biệt là tận dụng các điểm tốt hơn của jQuery, Dojo và các khung công tác khác, FP sẽ được giới thiệu bởi cửa sau của nhà phát triển web.

Kết hợp với các bao đóng, FP làm cho mã JS thực sự nhẹ, nhưng vẫn có thể đọc được.

Chúc mừng, PS


2
Đó là cách tôi thực sự bắt đầu đào lập trình chức năng. Không có gì tốt hơn danh sách của Prototype.js.Each (function (item) {}) hoặc toàn bộ phương thức hoạt động của jQuery.
Cory R. King

20
Javascript cho phép một người lập trình theo cách chức năng. Tuy nhiên, đó là một ngôn ngữ mô hình chéo, cho phép một người lập trình theo nhiều cách khác nhau (mà tôi thích, nhưng không liên quan) ... OO, chức năng, thủ tục, v.v.
RHSeeger


Các phương thức đối tượng jQuery chỉ là các hoạt động trong danh sách đơn nguyên. Lấy một đối tượng đại diện cho một container (hoặc chuỗi) làm đầu vào và trả về một container đối tượng làm đầu ra là một ví dụ tốt về sự tái cấu trúc thực tế của fmap.
Jared Updike

25

Hầu hết các ứng dụng đủ đơn giản để được giải quyết theo cách OO thông thường

  1. Cách OO không phải lúc nào cũng là "bình thường." Tiêu chuẩn của thập kỷ này là khái niệm ngoài lề của thập kỷ trước.

  2. Lập trình hàm là toán. Paul Graham trên Lisp (lập trình chức năng thay thế cho Lisp):

Vì vậy, lời giải thích ngắn gọn về lý do tại sao ngôn ngữ của những năm 1950 này không bị lỗi thời là nó không phải là công nghệ mà là toán học và toán học không trở nên cũ kỹ. Điều đúng đắn để so sánh Lisp không phải là phần cứng của những năm 1950, nhưng, giả sử, thuật toán Quicksort, được phát hiện vào năm 1960 và vẫn là loại mục đích chung nhanh nhất.


25

Tôi cá là bạn không biết bạn đã lập trình chức năng khi bạn sử dụng:

  • Công thức Excel
  • Nhà soạn nhạc thạch anh
  • JavaScript
  • Logo (Đồ họa rùa)
  • LINQ
  • SQL
  • Underscore.js (hoặc Lodash), D3

10
Javascript được coi là lập trình chức năng như thế nào?
Pacerier

8
Nó có các chức năng hạng nhất, chức năng bậc cao, đóng cửa, chức năng ẩn danh, ứng dụng một phần, cà ri và thành phần.
daniel1426

2
Haha. Sau khi viết một công thức Excel hoàn trả tải rộng hơn màn hình với các hàm lồng nhau. Tôi đã biết sau đó tôi đang lập trình chức năng, nhưng chưa biết thuật ngữ này.
ProfK

7
Vui lòng thêm C vào danh sách đó
Mandeep Janjua

2
@MandeepJanjua: Hả? Làm thế nào mà? Hoặc tại sao không phải bất kỳ ngôn ngữ sau đó?
Sz.

18

Lập trình viên trung bình của công ty, ví dụ như hầu hết những người tôi làm việc cùng, sẽ không hiểu điều đó và hầu hết các môi trường làm việc sẽ không cho phép bạn lập trình trong đó

Đó chỉ là vấn đề thời gian. Lập trình viên công ty trung bình của bạn học bất cứ điều gì Big Thing hiện tại. 15 năm trước, họ không hiểu OOP. NẾU FP bắt kịp, "lập trình viên trung bình của công ty" của bạn sẽ làm theo.

Nó không thực sự được dạy ở các trường đại học (hay ngày nay là vậy?)

Khác nhau rất nhiều. Tại trường đại học của tôi, SML là ngôn ngữ đầu tiên mà sinh viên được giới thiệu. Tôi tin rằng MIT dạy LISP như một khóa học năm đầu tiên. Tất nhiên, hai ví dụ này có thể không mang tính đại diện, nhưng tôi tin rằng hầu hết các trường đại học ít nhất cung cấp một số khóa học tùy chọn về FP, ngay cả khi chúng không biến nó thành một phần bắt buộc của chương trình giảng dạy.

Hầu hết các ứng dụng đủ đơn giản để được giải quyết theo cách OO thông thường

Đó thực sự không phải là vấn đề "đủ đơn giản". Một giải pháp sẽ đơn giản hơn (hoặc dễ đọc hơn, mạnh mẽ, thanh lịch, biểu diễn) trong FP? Nhiều thứ "đủ đơn giản để được giải quyết trong Java", nhưng nó vẫn đòi hỏi một lượng mã lớn.

Trong mọi trường hợp, hãy nhớ rằng những người đề xướng FP đã tuyên bố rằng đó là Điều lớn tiếp theo trong nhiều thập kỷ nay. Có lẽ họ đúng, nhưng hãy nhớ rằng họ không biết khi họ đưa ra cùng một yêu cầu 5, 10 hoặc 15 năm trước.

Tuy nhiên, một điều chắc chắn có lợi cho họ, đó là gần đây, C # đã có một bước chuyển biến mạnh mẽ về phía FP, đến mức nó thực sự biến một thế hệ lập trình viên thành lập trình viên FP, mà họ không hề hay biết . Điều đó có thể mở đường cho "cuộc cách mạng" của FP. Có lẽ. ;)


MIT đã từng dạy Scheme trong khóa học giới thiệu về CS, nhưng hiện tại nó sử dụng Python.
mipadi

1
"15 năm trước, họ không hiểu OOP" - Vấn đề là 15 năm trước, họ cũng không hiểu về FP. Và họ vẫn không làm gì hôm nay.
Jason Baker

15

Con người không thể hiểu được sự hoàn hảo và không hoàn hảo của nghệ thuật đã chọn nếu anh ta không thể nhìn thấy giá trị trong các nghệ thuật khác. Theo các quy tắc chỉ cho phép phát triển đến một điểm trong kỹ thuật và sau đó sinh viên và nghệ sĩ phải tìm hiểu thêm và tìm kiếm thêm. Nó có ý nghĩa để nghiên cứu các nghệ thuật khác cũng như những chiến lược.

Ai chưa học được gì nhiều hơn về bản thân bằng cách xem hoạt động của người khác? Để học kiếm học đàn guitar. Để học nắm đấm học thương mại. Chỉ nghiên cứu thanh kiếm sẽ khiến bạn hẹp hòi và không cho phép bạn phát triển ra bên ngoài.

- Miyamoto Musashi, "Một cuốn sách năm chiếc nhẫn"


12

Một tính năng chính trong ngôn ngữ chức năng là khái niệm về các chức năng hạng nhất. Ý tưởng là bạn có thể truyền các hàm dưới dạng tham số cho các hàm khác và trả về chúng dưới dạng giá trị.

Lập trình chức năng liên quan đến việc viết mã không thay đổi trạng thái. Lý do chính để làm như vậy là để các lệnh gọi liên tiếp đến một hàm sẽ mang lại kết quả tương tự. Bạn có thể viết mã chức năng bằng bất kỳ ngôn ngữ nào hỗ trợ các chức năng hạng nhất, nhưng có một số ngôn ngữ, như Haskell, không cho phép bạn thay đổi trạng thái. Trên thực tế, bạn không được phép tạo ra bất kỳ tác dụng phụ nào (như in ra văn bản) - điều này nghe có vẻ như hoàn toàn vô dụng.

Thay vào đó, Haskell sử dụng một cách tiếp cận khác với IO: monads. Đây là những đối tượng có chứa hoạt động IO mong muốn được thực thi bởi toplevel của trình thông dịch của bạn. Ở bất kỳ cấp độ nào khác, chúng chỉ đơn giản là các đối tượng trong hệ thống.

Những lợi thế nào lập trình chức năng cung cấp? Lập trình chức năng cho phép mã hóa với ít tiềm năng hơn cho các lỗi vì mỗi thành phần được cách ly hoàn toàn. Ngoài ra, sử dụng các hàm đệ quy và hàm hạng nhất cho phép các bằng chứng đơn giản về tính chính xác thường phản ánh cấu trúc của mã.


12

Tôi không nghĩ rằng hầu hết mọi người thực tế nghĩ rằng lập trình chức năng sẽ bắt kịp (trở thành mô hình chính như OO). Xét cho cùng, hầu hết các vấn đề kinh doanh không phải là các vấn đề toán học đẹp mắt mà là các quy tắc bắt buộc để di chuyển dữ liệu và hiển thị chúng theo nhiều cách khác nhau, điều đó có nghĩa là nó không phù hợp với mô hình lập trình chức năng thuần túy (đường cong học tập của đơn vị vượt xa OO.)

OTOH, lập trình chức năng là những gì làm cho lập trình thú vị. Nó khiến bạn đánh giá cao vẻ đẹp vốn có, vượt thời gian của những biểu hiện cô đọng của toán học cơ bản của vũ trụ. Mọi người nói rằng học lập trình chức năng sẽ giúp bạn trở thành một lập trình viên tốt hơn. Điều này tất nhiên là rất chủ quan. Cá nhân tôi cũng không nghĩ điều đó hoàn toàn đúng.

Nó làm cho bạn trở thành một chúng sinh tốt hơn.


6
Tôi không nghĩ rằng OO vốn dễ dàng hơn FP. Nó thực sự phụ thuộc vào nền tảng của bạn (Tôi là một người toán học, đoán xem tôi thấy điều gì dễ dàng hơn nhiều? :) Chết tiệt những người OO và những quy tắc điên rồ của bạn.
temp2290

14
Monads không khó hiểu. Đừng mua vào bullcrap đó.
Rayne

-1 OOP khó hơn FP
chỉ là ai đó

-1 Chúng tôi sẽ không viết trình biên dịch tối ưu hóa bằng OCaml hoặc Haskell nếu FP chỉ thích hợp cho các bài toán khá.
gracchus

8

Tôi phải dày đặc, nhưng tôi vẫn không hiểu. Có bất kỳ ví dụ thực tế nào về ứng dụng nhỏ được viết bằng ngôn ngữ chức năng như F # nơi bạn có thể xem mã nguồn và xem cách thức và lý do tại sao nên sử dụng cách tiếp cận như vậy tốt hơn là, nói, C #?


Nhận xét tốt +1. @Mendelt: "dễ tiếp cận hơn"? Bạn có nghĩa là đau đầu nhanh hơn khi bạn xem mã?
Patrick Honorez

2
Xem thư viện F # này: quanttec.com/fparsec/tutorial.html . Tôi rất thích xem mã mẫu trong C # với các trình phân tích cú pháp trông có vẻ thanh lịch và dễ đọc bằng mã F #, ngay cả khi chúng được biên dịch theo cùng một hướng dẫn. Và hãy thử chuyển FParsec từ F # sang C # và xem cách mã nở.
Jared Updike

8

Tôi đã chỉ ra rằng mọi thứ bạn đã nói về các ngôn ngữ chức năng, hầu hết mọi người đều nói về các ngôn ngữ hướng đối tượng khoảng 20 năm trước. Trước đó, rất phổ biến khi nghe về OO:

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

Thay đổi phải đến từ một nơi nào đó. Một thay đổi có ý nghĩa và quan trọng sẽ khiến chính nó xảy ra bất kể mọi người được đào tạo về các công nghệ trước đó có cho rằng thay đổi là không cần thiết hay không. Bạn có nghĩ rằng sự thay đổi thành OO là tốt mặc dù tất cả những người chống lại nó vào thời điểm đó?


2
* Lập trình viên trung bình của công ty, ví dụ như hầu hết những người tôi làm việc cùng, sẽ không hiểu điều đó và hầu hết các môi trường làm việc sẽ không cho phép bạn lập trình trong đó - Điều đó vẫn đúng với OOP ở nhiều nơi tôi đã làm việc :) (tất nhiên họ nói họ đang làm OOP, nhưng họ thì không)
tolanj

7

F # có thể bắt kịp bởi vì Microsoft đang đẩy nó.

Chuyên nghiệp:

  • F # sẽ là một phần của phiên bản tiếp theo của Visual Studio
  • Microsoft đang xây dựng cộng đồng một thời gian - các nhà truyền giáo, sách, chuyên gia tư vấn làm việc với các khách hàng cao cấp, tiếp xúc đáng kể tại các hội nghị MS.
  • F # là ngôn ngữ .Net đầu tiên và là ngôn ngữ chức năng đầu tiên đi kèm với nền tảng thực sự lớn (không phải tôi nói rằng Lisp, Haskell, Erlang, Scala, OCaml không có nhiều thư viện, chúng không hoàn chỉnh như .Net Là)
  • Hỗ trợ mạnh mẽ cho song song

Contra:

  • F # rất khó để bắt đầu ngay cả khi bạn giỏi với C # và .Net - ít nhất là đối với tôi :(
  • có lẽ sẽ khó tìm được nhà phát triển F # tốt

Vì vậy, tôi cho 50:50 cơ hội để F # trở nên quan trọng. Các ngôn ngữ chức năng khác sẽ không làm cho nó trong tương lai gần.


6
Tôi cho rằng Scala là một nền tảng khá sâu sắc với JRE.
cdmckay

2
Về thư viện, nó thực sự phụ thuộc vào những gì bạn đang làm. F # được nhắm mục tiêu vào lĩnh vực tài chính và cũng có thể áp dụng cho máy tính khoa học nhưng OCaml thực sự có thư viện tốt hơn cho các ứng dụng như vậy so với .NET. Ví dụ, khi tôi đến F # từ OCaml, tôi đã không tìm thấy một FFT đàng hoàng và cuối cùng tôi đã viết (và bán) bản thân mình trong C # và sau đó là F #.
Jon Harrop

1
LINQ là cầu nối tốt để sử dụng các khái niệm chức năng với C # và VB.Net ... Và tôi thấy nó ít đau đớn hơn khi đọc so với F #
Matthew Whited

5

Tôi nghĩ một lý do là một số người cảm thấy rằng phần quan trọng nhất của việc một ngôn ngữ sẽ được chấp nhận là ngôn ngữ đó tốt như thế nào . Thật không may, mọi thứ hiếm khi đơn giản như vậy. Ví dụ, tôi sẽ lập luận rằng yếu tố lớn nhất đằng sau sự chấp nhận của Python không phải là ngôn ngữ (mặc dù đó khá quan trọng). Lý do lớn nhất khiến Python trở nên phổ biến là thư viện tiêu chuẩn khổng lồ và cộng đồng thư viện bên thứ 3 thậm chí còn lớn hơn.

Các ngôn ngữ như Clojure hoặc F # có thể là ngoại lệ đối với quy tắc này vì chúng được xây dựng dựa trên JVM / CLR. Kết quả là, tôi không có câu trả lời cho họ.


+1 nhưng đừng quên sức mạnh của tiếp thị và thực tế là hàng núi mã kế thừa của công ty bạn sẽ không chuyển đổi ngôn ngữ nhờ vào một số xu hướng mới thú vị.
temp2290

Và bạn đã quên đề cập: Google đang phổ biến python.
Hao Wooi Lim

4

Hầu hết các ứng dụng có thể được giải quyết trong [chèn ngôn ngữ yêu thích của bạn, mô hình, v.v. vào đây].

Mặc dù, điều này là đúng, các công cụ khác nhau có thể được sử dụng để giải quyết các vấn đề khác nhau. Chức năng chỉ cho phép một sự trừu tượng hóa mức cao (cao hơn?) Khác cho phép thực hiện công việc của chúng ta hiệu quả hơn khi được sử dụng đúng cách.


4

Dường như với tôi rằng những người chưa bao giờ học Lisp hoặc Scheme khi còn là sinh viên đang khám phá ra nó. Cũng như rất nhiều thứ trong lĩnh vực này có xu hướng cường điệu và tạo ra những kỳ vọng cao ...

Nó sẽ qua.

Lập trình chức năng là tuyệt vời. Tuy nhiên, nó sẽ không chiếm lĩnh thế giới. C, C ++, Java, C #, v.v. vẫn sẽ xuất hiện.

Điều gì sẽ đến từ điều này tôi nghĩ là khả năng đa ngôn ngữ nhiều hơn - ví dụ như triển khai mọi thứ bằng ngôn ngữ chức năng và sau đó cấp quyền truy cập vào nội dung đó bằng các ngôn ngữ khác.


1
C # bây giờ là một ngôn ngữ lập trình chức năng (nhiều như Lisp) bởi vì nó có các đóng từ vựng hạng nhất. Thật vậy, chúng đã được sử dụng trong WPF và TPL. Vì vậy, lập trình chức năng rõ ràng là đã ở đây.
Jon Harrop


3

Mọi thứ đã được di chuyển theo một hướng chức năng trong một thời gian. Hai đứa trẻ mới mẻ trong vài năm qua, Ruby và Python, gần như hoàn toàn gần gũi với các ngôn ngữ chức năng hơn những gì xuất hiện trước chúng - đến nỗi một số Lispers đã bắt đầu hỗ trợ một hoặc hai thứ khác là "đủ gần".

Và với phần cứng song song ồ ạt gây áp lực tiến hóa lên tất cả mọi người - và các ngôn ngữ chức năng là nơi tốt nhất để đối phó với các thay đổi - đó không phải là một bước nhảy vọt như đã từng nghĩ rằng Haskell hoặc F # sẽ là điều lớn tiếp theo.


3

Bạn đã theo dõi sự phát triển của ngôn ngữ lập trình gần đây? Mỗi bản phát hành mới của tất cả các ngôn ngữ lập trình chính thống dường như mượn ngày càng nhiều tính năng từ lập trình chức năng.

  • Đóng cửa, chức năng ẩn danh, chuyển và trả lại các chức năng như các giá trị từng là các tính năng kỳ lạ chỉ được biết đến với tin tặc Lisp và ML. Nhưng dần dần, C #, Delphi, Python, Perl, Javascript, đã thêm hỗ trợ cho việc đóng cửa. Không thể có bất kỳ ngôn ngữ sắp tới nào được thực hiện nghiêm túc mà không đóng cửa.

  • Một số ngôn ngữ, đặc biệt là Python, C # và Ruby có hỗ trợ riêng cho việc hiểu danh sách và trình tạo danh sách.

  • ML đã đi tiên phong trong lập trình chung vào năm 1973, nhưng hỗ trợ cho thuốc generic ("đa hình tham số") chỉ trở thành một tiêu chuẩn công nghiệp trong 5 năm gần đây. Nếu tôi nhớ chính xác, Fortran đã hỗ trợ thuốc generic vào năm 2003, tiếp theo là Java 2004, C # năm 2005, Delphi năm 2008 (Tôi biết C ++ đã hỗ trợ các mẫu từ năm 1979, nhưng 90% các cuộc thảo luận về STL của C ++ bắt đầu với "ở đây có quỷ" .)

Điều gì làm cho các tính năng này hấp dẫn các lập trình viên? Nó rõ ràng rõ ràng: nó giúp các lập trình viên viết mã ngắn hơn . Tất cả các ngôn ngữ trong tương lai sẽ hỗ trợ - ở mức tối thiểu - đóng cửa nếu họ muốn duy trì tính cạnh tranh. Về mặt này, lập trình chức năng đã có trong dòng chính.

Hầu hết các ứng dụng đủ đơn giản để được giải quyết theo cách OO thông thường

Ai nói không thể sử dụng lập trình chức năng cho những điều đơn giản? Không phải mọi chương trình chức năng đều cần phải là trình biên dịch, định lý định lý hoặc chuyển mạch viễn thông song song ồ ạt. Tôi thường xuyên sử dụng F # cho các kịch bản bỏ đi ad hoc ngoài các dự án phức tạp hơn của tôi.



3

Liên kết không mở. Lỗi 403.
Alexey Frunze

Đây có thể là một sự thay thế tốt? cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf
canadiancreed

Liên kết chết. Đây là lý do tại sao các loại câu trả lời không thuận lợi để trích dẫn cũng như liên kết.
Sylwester

Tôi đã sửa liên kết. @Sylwester đó là sự thật, nhưng đó là một tài liệu 23 trang. Chắt lọc giấy để trả lời trên trang web này sẽ không làm điều đó công lý.
grom

2

Tôi đồng ý với điểm đầu tiên, nhưng thời gian thay đổi. Các tập đoàn sẽ trả lời, ngay cả khi họ là người chấp nhận muộn, nếu họ thấy rằng có một lợi thế cần có. Cuộc sống thật năng động.

Họ đã dạy Haskell và ML tại Stanford vào cuối những năm 90. Tôi chắc chắn rằng những nơi như Carnegie Mellon, MIT, Stanford và các trường tốt khác đang giới thiệu nó cho sinh viên.

Tôi đồng ý rằng hầu hết các ứng dụng "phơi bày cơ sở dữ liệu quan hệ trên web" sẽ tiếp tục trong thời gian dài. Java EE, .NET, RoR và PHP đã phát triển một số giải pháp khá tốt cho vấn đề đó.

Bạn đã đánh vào một điều quan trọng: Đó có thể là vấn đề không thể giải quyết dễ dàng bằng các biện pháp khác sẽ thúc đẩy lập trình chức năng. Đó sẽ là gì?

Phần cứng đa lõi và điện toán đám mây khổng lồ sẽ đẩy chúng theo?


2

Bởi vì FP có lợi ích đáng kể về năng suất, độ tin cậy và khả năng bảo trì. Nhiều lõi có thể là một ứng dụng sát thủ cuối cùng đã khiến các tập đoàn lớn chuyển đổi mặc dù khối lượng lớn mã di sản. Ngoài ra, ngay cả các ngôn ngữ thương mại lớn như C # cũng mang một hương vị chức năng riêng biệt do lo ngại nhiều lõi - đơn giản là tác dụng phụ không phù hợp với sự tương tranh và song song.

Tôi không đồng ý rằng các lập trình viên "bình thường" sẽ không hiểu điều đó. Họ sẽ, giống như cuối cùng họ đã hiểu OOP (điều này cũng bí ẩn và kỳ lạ, nếu không muốn nói là như vậy).

Ngoài ra, hầu hết các trường đại học đều dạy FP, nhiều người thậm chí còn dạy nó như khóa học lập trình đầu tiên.


Xin lỗi, nhưng FP đã dài gần gấp 3 lần OOP. Đây đơn giản không phải là vấn đề cần thêm thời gian. Nó sẽ mất một cái gì đó nhiều hơn để làm cho dòng chính FP.
Jason Baker

Làm thế nào bạn có thể bỏ lỡ một phần của bài viết của tôi, nơi tôi giải thích rằng "một cái gì đó nhiều hơn" rất có thể là nhiều lõi? Và một cái gì đó "ở xung quanh" không thực sự phù hợp. Mọi người hiểu OOP vì nó mang lại lợi ích hữu hình vào thời điểm đó, FP mới chỉ trở nên thiết thực.
Sebastian

2

Wow - đây là một cuộc thảo luận thú vị. Suy nghĩ của riêng tôi về điều này:

FP làm cho một số tác vụ tương đối đơn giản (so với các ngôn ngữ không có FP). Không có ngôn ngữ-FP nào đã bắt đầu lấy ý tưởng từ FP, vì vậy tôi nghi ngờ rằng xu hướng này sẽ tiếp tục và chúng ta sẽ thấy nhiều sự hợp nhất sẽ giúp mọi người thực hiện bước nhảy vọt lên FP dễ dàng hơn.


2

Tôi không biết liệu nó có bắt kịp hay không, nhưng từ các cuộc điều tra của tôi, một ngôn ngữ chức năng gần như chắc chắn đáng để học hỏi và sẽ giúp bạn trở thành một lập trình viên tốt hơn. Chỉ cần hiểu tính minh bạch tham chiếu làm cho rất nhiều quyết định thiết kế trở nên dễ dàng hơn nhiều - và các chương trình kết quả dễ dàng hơn nhiều để lý do. Về cơ bản, nếu bạn gặp phải một vấn đề, thì nó có xu hướng chỉ là vấn đề với đầu ra của một hàm, chứ không phải là một vấn đề với trạng thái không nhất quán, có thể do bất kỳ trong số hàng trăm lớp / phương thức / hàm gây ra trong một ngôn ngữ khác biệt với tác dụng phụ.

Bản chất không trạng thái của bản đồ FP tự nhiên hơn với bản chất không trạng thái của web và do đó, các ngôn ngữ chức năng cho vay dễ dàng hơn đối với các ứng dụng web RESTFUL thanh lịch hơn. Tương phản với các khung công tác JAVA và .NET cần sử dụng các HACKS xấu xí khủng khiếp như các phím VIEWSTATE và SESSION để duy trì trạng thái ứng dụng và duy trì sự trừu tượng (đôi khi khá rò rỉ) của ngôn ngữ mệnh lệnh trạng thái, trên nền tảng chức năng không trạng thái như trên web.

Ngoài ra, ứng dụng của bạn càng không trạng thái, nó càng dễ dàng cho vay để xử lý song song. Rất quan trọng cho web, nếu trang web của bạn trở nên phổ biến. Không phải lúc nào cũng đơn giản chỉ cần thêm nhiều phần cứng vào một trang web để có hiệu suất tốt hơn.


2

Quan điểm của tôi là bây giờ họ sẽ nắm bắt được rằng Microsoft đã đẩy nó đi xa hơn vào dòng chính. Đối với tôi, nó hấp dẫn bởi vì những gì nó có thể làm cho chúng tôi, bởi vì đó là một thách thức mới và vì những cơ hội việc làm mà nó phẫn nộ cho tương lai.

Khi đã thành thạo, nó sẽ là một công cụ khác để tiếp tục giúp chúng ta làm việc hiệu quả hơn khi là lập trình viên.


2

Một điểm bị bỏ lỡ trong cuộc thảo luận là các hệ thống loại tốt nhất được tìm thấy trong các ngôn ngữ FP đương đại. Hơn nữa, trình biên dịch có thể tự động suy ra tất cả (hoặc ít nhất là) các loại.

Điều thú vị là người ta dành một nửa thời gian để viết tên loại khi lập trình Java, nhưng Java vẫn không phải là loại an toàn. Mặc dù bạn không bao giờ có thể viết các loại trong chương trình Haskell (ngoại trừ dưới dạng một loại tài liệu được kiểm tra trình biên dịch) và mã này là loại an toàn 100%.


1

Ngoài các câu trả lời khác, việc đưa ra giải pháp theo thuật ngữ chức năng thuần túy buộc người ta phải hiểu vấn đề tốt hơn. Ngược lại, suy nghĩ theo phong cách chức năng sẽ phát triển tốt hơn * kỹ năng giải quyết vấn đề.

* Hoặc vì mô hình chức năng tốt hơn hoặc bởi vì nó sẽ đủ khả năng cho một góc tấn công bổ sung.

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.