Lợi ích của lập trình hàm là gì? [đóng cửa]


95

Bạn nghĩ lợi ích của lập trình hàm là gì? Và chúng áp dụng cho các lập trình viên ngày nay như thế nào?

Sự khác biệt lớn nhất giữa lập trình chức năng và OOP là gì?


5
Nghịch lý Blub. paulgraham.com/avg.html
missingfaktor

Câu trả lời:


75

Phong cách của lập trình chức năng là mô tả những gì bạn muốn, thay vì làm thế nào để có được nó. nghĩa là: thay vì tạo vòng lặp for với một biến vòng lặp và duyệt qua một mảng để thực hiện điều gì đó với mỗi ô, bạn sẽ nói tương đương với "nhãn này đề cập đến một phiên bản của mảng này trong đó hàm này đã được thực hiện trên tất cả các các yếu tố. "

Lập trình chức năng chuyển các ý tưởng lập trình cơ bản hơn vào trình biên dịch, các ý tưởng như hiểu danh sách và bộ nhớ đệm.

Lợi ích lớn nhất của lập trình Chức năng là sự ngắn gọn, vì mã có thể ngắn gọn hơn. Một chương trình chức năng không tạo biến trình lặp để làm trung tâm của vòng lặp, vì vậy biến này và các loại chi phí khác sẽ bị loại bỏ khỏi mã của bạn.

Lợi ích chính khác là tính đồng thời, dễ thực hiện hơn với lập trình chức năng vì trình biên dịch xử lý hầu hết các hoạt động được sử dụng để yêu cầu thiết lập thủ công các biến trạng thái (như trình lặp trong vòng lặp).

Một số lợi ích về hiệu suất cũng có thể được nhìn thấy trong ngữ cảnh của một bộ xử lý đơn lẻ, tùy thuộc vào cách chương trình được viết, vì hầu hết các ngôn ngữ chức năng và phần mở rộng đều hỗ trợ đánh giá lười biếng. Trong Haskell, bạn có thể nói "nhãn này đại diện cho một mảng chứa tất cả các số chẵn". Một mảng như vậy lớn vô cùng, nhưng bạn có thể yêu cầu phần tử thứ 100.000 của mảng đó bất kỳ lúc nào mà không cần biết - tại thời điểm khởi tạo mảng - chỉ giá trị lớn nhất mà bạn cần. Giá trị sẽ chỉ được tính khi bạn cần và không cần thêm nữa.


12
Tôi cảm thấy đoạn đầu tiên của bạn gần với việc mô tả lập trình quan hệ khai báo như Prolog hơn là lập trình hàm.
McPherrinM

6
@McPherrinM: ngôn ngữ chức năng là ngôn ngữ khai báo, thay vì mệnh lệnh.
Lie Ryan

2
Có vẻ như bạn đang nhầm lẫn giữa DP và IP, thủ tục so với FP . FP đang cung cấp cho việc tách các mối quan tâm bằng cách nhấn mạnh thành phần hàm, tức là tách các phần phụ thuộc giữa các phép tính con của một phép tính xác định.
Shelby Moore III

2
@LieRyan không chính xác. Xin vui lòng xem các liên kết trong comment trước của tôi
Shelby Moore III

Đồng thời là có nhiều luồng có thể tương tác với nhau, điều này là bắt buộc. Thực hiện nhiều phép tính độc lập cùng một lúc được gọi là song song . Xem en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy

29

Lợi ích lớn nhất là nó không phải là những gì bạn đã quen. Chọn một ngôn ngữ như Scheme và học cách giải quyết các vấn đề với nó, và bạn sẽ trở thành một lập trình viên giỏi hơn bằng các ngôn ngữ mà bạn đã biết. Nó giống như học một ngôn ngữ thứ hai của con người. Bạn cho rằng những người khác về cơ bản là một biến thể của riêng bạn bởi vì bạn không có gì để so sánh với nó. Tiếp xúc với những người khác, những người cụ thể không liên quan đến những gì bạn đã biết, là hướng dẫn.


28
đó là lợi ích của việc học nó, không phải là lợi ích của chính mô hình
Moe

2
Nhưng chúng có thực sự tách biệt? Từ quan điểm của người đặt câu hỏi ban đầu, tôi sẽ nói là không - họ rất có thể đang tìm kiếm lợi ích khi bỏ ra nỗ lực để học một ngôn ngữ chức năng.
Kendall Helmstetter Gelner

3
"đó là lợi ích của việc học nó, không phải là lợi ích của chính mô hình". Mô hình sẽ rò rỉ vào công việc OOP khác của bạn và có thể giúp đơn giản hóa sự phát triển của bạn ở đó. Bạn có thể tiếp cận các vấn đề từ "tính toán đầu ra này từ đầu vào này" và "soạn hai hàm này để tính toán dữ liệu mới" thay vì "đợi --- trạng thái của một số biến được chia sẻ ở đó là gì?" và "Tôi đã làm cho các thủ tục này thực hiện theo đúng trình tự chưa?". Nghiêm túc mà nói, bạn nhận được những lợi ích này (từ việc hiểu mô hình FP) trong Python, C #, C ++, Java, bạn đặt tên cho nó.
Jared Updike

11

Tại sao lại quan trọng lập trình chức năng
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

trừu tượng

Khi phần mềm ngày càng trở nên phức tạp hơn, thì việc cấu trúc nó ngày càng trở nên quan trọng hơn. Phần mềm có cấu trúc tốt dễ viết và gỡ lỗi, đồng thời cung cấp một bộ sưu tập các mô-đun có thể được sử dụng lại để giảm chi phí lập trình trong tương lai.

Trong bài báo này, chúng tôi chỉ ra rằng hai đặc điểm của ngôn ngữ hàm nói riêng, hàm bậc cao và đánh giá lười biếng, có thể đóng góp đáng kể vào tính mô đun. Ví dụ: chúng tôi thao tác với danh sách và cây, lập trình một số thuật toán số và triển khai phương pháp heuristic alpha-beta (một thuật toán từ Trí tuệ nhân tạo được sử dụng trong các chương trình chơi trò chơi). Chúng tôi kết luận rằng vì tính mô-đun là chìa khóa để lập trình thành công, lập trình chức năng mang lại những lợi thế quan trọng cho việc phát triển phần mềm.


10

Do đó, điểm khởi đầu tốt là cố gắng hiểu một số điều không thể thực hiện được trong ngôn ngữ mệnh lệnh nhưng có thể thực hiện được trong ngôn ngữ chức năng.

Nếu bạn đang nói về khả năng tính toán, tất nhiên không có gì là khả thi trong lập trình chức năng nhưng không bắt buộc (hoặc ngược lại).

Điểm của các mô hình lập trình khác nhau không phải là làm cho những thứ trước đây không thể thành có thể, mà là làm cho những thứ trước đây trở nên dễ dàng.

Lập trình chức năng nhằm mục đích cho phép bạn dễ dàng viết các chương trình ngắn gọn, không có lỗi và có thể chạy song song.


5

Nó không nhất thiết phải là cái này hay cái khác: sử dụng ngôn ngữ như C # 3.0 cho phép bạn kết hợp các yếu tố tốt nhất của mỗi ngôn ngữ. OO có thể được sử dụng cho cấu trúc quy mô lớn ở cấp lớp trở lên, Kiểu chức năng cho cấu trúc quy mô nhỏ ở cấp phương pháp.

Sử dụng kiểu Chức năng cho phép viết mã khai báo ý định của nó một cách rõ ràng, không bị trộn lẫn với các câu lệnh luồng điều khiển, v.v. Do các nguyên tắc như lập trình không có tác dụng phụ, việc lập luận về mã và kiểm tra tính đúng đắn của nó sẽ dễ dàng hơn nhiều. .


5

Tôi nghĩ ví dụ thực tế nhất về sự cần thiết của lập trình chức năng là đồng thời - các chương trình chức năng tự nhiên an toàn theo luồng và với sự phát triển của phần cứng đa lõi, điều này cực kỳ quan trọng.

Lập trình hàm cũng làm tăng tính mô-đun - bạn thường có thể thấy các phương thức / hàm bắt buộc quá dài - hầu như bạn sẽ không bao giờ thấy một hàm dài hơn một vài dòng. Và vì mọi thứ đều được tách rời - khả năng tái sử dụng được cải thiện nhiều và việc kiểm tra đơn vị rất dễ dàng.


3

Một khi chương trình phát triển, số lượng lệnh trong vốn từ vựng của chúng ta trở nên quá nhiều, gây khó khăn cho việc sử dụng. Đây là nơi mà lập trình hướng đối tượng làm cho cuộc sống của chúng ta dễ dàng hơn, vì nó cho phép chúng ta tổ chức các lệnh của mình theo cách tốt hơn. Chúng ta có thể liên kết tất cả các lệnh liên quan đến khách hàng với một số thực thể khách hàng (một lớp), điều này làm cho mô tả rõ ràng hơn rất nhiều. Tuy nhiên, chương trình vẫn là một chuỗi các lệnh chỉ định cách nó tiến hành.

Lập trình hàm cung cấp một cách hoàn toàn khác để mở rộng vốn từ vựng. Không giới hạn việc thêm các lệnh nguyên thủy mới; chúng ta cũng có thể thêm các cấu trúc điều khiển mới – nguyên thủy chỉ định cách chúng ta có thể đặt các lệnh lại với nhau để tạo một chương trình. Trong các ngôn ngữ mệnh lệnh, chúng ta có thể soạn các lệnh theo một trình tự hoặc sử dụng một số lượng hạn chế các cấu trúc dựng sẵn như vòng lặp, nhưng nếu bạn nhìn vào các chương trình điển hình, bạn sẽ vẫn thấy nhiều cấu trúc lặp lại; các cách kết hợp lệnh phổ biến


1

Đừng nghĩ về lập trình chức năng dưới dạng "nhu cầu". Thay vào đó, hãy nghĩ về nó như một kỹ thuật lập trình khác sẽ mở mang đầu óc bạn giống như OOP, các mẫu, hợp ngữ, v.v. có thể đã thay đổi hoàn toàn cách suy nghĩ của bạn khi (nếu) bạn học chúng. Cuối cù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 giỏi hơn.


0

Nếu bạn chưa biết lập trình hàm thì việc học nó sẽ cho bạn nhiều cách giải quyết vấn đề hơn.

FP là một sự tổng quát hóa đơn giản nhằm thúc đẩy các chức năng đến các giá trị hạng nhất trong khi OOP dành cho cấu trúc mã quy mô lớn. Tuy nhiên, có một số chồng chéo, trong đó các mẫu thiết kế OOP có thể được biểu diễn trực tiếp và ngắn gọn hơn nhiều bằng cách sử dụng các hàm hạng nhất.

Nhiều ngôn ngữ cung cấp cả FP và OOP, bao gồm OCaml, C # 3.0 và F #.

Chúc mừng, Jon Harrop.

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.