Nếu chúng ta có thể lập trình chức năng với Python, chúng ta có cần một ngôn ngữ lập trình chức năng cụ thể không? [đóng cửa]


22

Sử dụng trình tạo và lambda, chúng ta có thể lập trình chức năng với Python. Bạn cũng có thể đạt được điều tương tự với Ruby.

Vì vậy, câu hỏi là: tại sao chúng ta cần các ngôn ngữ lập trình chức năng cụ thể như Erlang, Haskell và Scheme? Có điều gì khác biệt mà các ngôn ngữ lập trình chức năng cụ thể này cung cấp không? Tại sao chúng ta không thể sử dụng Python để lập trình chức năng?


30
tất cả những thứ đó đã tồn tại ngay cả trước khi con trăn được tạo ra
Mahmoud Hossam

51
Một ford Pinto là một chiếc xe hơi. Tại sao chúng ta cần những chiếc xe nhanh cụ thể như Ferraris?
Martin York

11
Sử dụng các lớp và mẫu, chúng ta có thể làm bất cứ điều gì OO trong C ++. Tại sao Java và Python từng được tạo ra? Họ thêm gì?
9000

19
Tất cả các ngôn ngữ lập trình (bao gồm một số ngôn ngữ nghiên cứu học thuật thuần túy) đều tương đương với Turing, vì vậy những gì bạn có thể làm bằng ngôn ngữ A bạn có thể làm bằng bất kỳ ngôn ngữ nào khác. Vì vậy, theo lối
Maglob

17
Nếu bạn biết bất kỳ ngôn ngữ nào trong số này, bạn sẽ không cho rằng Python thực hiện tốt chức năng lập trình. Nó không. Nó đủ tốt để kết hợp một phần của những thứ thuộc về FP, nhưng không tốt hơn.

Câu trả lời:


20

Tôi đánh giá cao câu hỏi này, vì cá nhân tôi là một fan hâm mộ lớn của cả Python và phong cách lập trình chức năng. Tôi có một nền tảng lâu dài về Python và tôi đã bắt đầu học Haskell gần đây, vì vậy đây là một số điểm dựa trên kinh nghiệm cá nhân của tôi về sự khác biệt giữa các ngôn ngữ này, từ góc độ chức năng.

Độ tinh khiết

Ngay cả khi bạn không quan tâm đến độ tinh khiết của các chức năng (nghĩa là không có tác dụng phụ) như một hoàng tử, thì nó cũng có tác dụng thực tế đối với việc đọc mã và lý do về nó dễ dàng như thế nào. Ngay cả khi bạn duy trì độ tinh khiết trong các hàm Python của riêng mình, có một sự khác biệt lớn trong việc trình biên dịch thực thi độ tinh khiết và, hầu hết, có thư viện chuẩn được xây dựng dựa trên các cấu trúc dữ liệu thuần khiết và bất biến.

Hiệu suất

Bạn có thể hoặc không quan tâm đến hiệu suất tùy thuộc vào miền ứng dụng của bạn là gì, nhưng gõ tĩnh và độ tinh khiết được bảo đảm mang lại cho trình biên dịch nhiều hơn để làm việc, so với Python và các ngôn ngữ động khác (mặc dù tôi phải thừa nhận rằng PyPy đang làm rất tốt đường vào, và ví dụ LuaJIT giáp với phép lạ).

Tối ưu hóa cuộc gọi đuôi

Liên quan đến hiệu suất, nhưng hơi khác nhau. Ngay cả khi bạn không quan tâm quá nhiều đến hiệu năng thời gian chạy, việc không tối ưu hóa cuộc gọi đuôi (đặc biệt là đệ quy đuôi) sẽ hạn chế các cách bạn có thể thực hiện thuật toán trong Python mà không đạt giới hạn ngăn xếp.

Cú pháp

Đây là lý do lớn nhất khiến tôi bắt đầu xem xét các ngôn ngữ chức năng "thực" thay vì chỉ sử dụng Python với phong cách chức năng. Mặc dù tôi nghĩ rằng Python có một cú pháp rất biểu cảm nói chung, nhưng nó có một số điểm yếu đặc trưng cho mã hóa chức năng. Ví dụ:

  • Cú pháp cho các hàm lambda khá dài dòng và bị giới hạn trong những gì chúng có thể chứa
  • Không có cú pháp cho thành phần chức năng tức là f = g . hvs.f = lambda *arg: g(h(*arg))
  • Không có cú pháp cho ứng dụng một phần tức là f = map gvs.f = functools.partial(map, g)
  • Không có đường cú pháp để sử dụng toán tử infix trong các hàm bậc cao hơn tức là sum = reduce (+) lstvs.sum = reduce(operator.add, lst)
  • Không khớp mẫu hoặc bảo vệ cho các đối số chức năng, giúp dễ dàng thể hiện các điều kiện kết thúc đệ quy và một số trường hợp viền với cú pháp rất dễ đọc.
  • Chân đế không bao giờ là tùy chọn cho các cuộc gọi chức năng và không có đường cú pháp cho các cuộc gọi lồng nhau. Tôi đoán đây là vấn đề của hương vị, nhưng đặc biệt là trong mã chức năng, tôi thấy nó phổ biến đối với các cuộc gọi chức năng chuỗi và tôi thấy y = func1 $ func2 $ func3 xdễ đọc hơn y = func1(func2(func3(x))), một khi bạn đã quen với ký hiệu đó.

28

Đây là những khác biệt quan trọng nhất:

Haskell

  • Đánh giá lười biếng
  • Biên dịch mã máy
  • Gõ tĩnh đảm bảo các chức năng là thuần túy
  • Kiểu suy luận

Haskell và Erlang

  • Khớp mẫu

Erlang

  • Mô hình diễn viên của các quá trình đồng thời, trọng lượng nhẹ

Kế hoạch

  • Macro

Tất cả các ngôn ngữ

  • đóng cửa thực sự (ruby có đóng cửa, cho dù trăn có thể được tranh luận, xem các ý kiến)
  • một thư viện chuẩn phù hợp với phong cách lập trình chức năng (bộ sưu tập bất biến, bản đồ, bộ lọc, gấp, v.v.)
  • đệ quy đuôi (điều này cũng có thể được tìm thấy trong một số ngôn ngữ phi chức năng)

Ngoài ra, bạn nên xem các ngôn ngữ từ gia đình ML như SML, Ocaml và F # và Scala, hợp nhất OO và lập trình chức năng theo một cách mới. Tất cả các ngôn ngữ này có các tính năng thú vị độc đáo.


3
+1 bài viết hay. Bạn có thể thêm suy luận kiểu trên các quy trình Haskell và Light-weight trên Erlang.
Jonas

1
Python có bản đồ, bộ lọc và gấp (giảm). Về "đóng cửa thực sự": Nếu bạn định nghĩa một bao đóng thực sự là một bao đóng có thể chứa một cái gì đó không phải là một biểu thức duy nhất, thì Haskell cũng không có các bao đóng thực sự (nhưng tất nhiên Haskell có vài thứ không phải là biểu thức ...) . Tuy nhiên, điểm về cấu trúc dữ liệu bất biến là một điểm tốt, vì vậy +1 cho điều đó. Ngoài ra: đệ quy đuôi (và nói chung là đệ quy ít tốn kém hơn).
sepp2k

2
+1 cho "gõ tĩnh đảm bảo các chức năng là thuần túy". Thật tuyệt khi có một hệ thống loại phân biệt giữa các chức năng thuần túy và không thuần túy. (C ++ của const doe snot đếm. :)
Macke

1
@btilly: Tôi sẽ không coi đó là một bao đóng nếu bạn không thể gán cho một biến có phạm vi. Mặt khác, chúng ta phải nói rằng Java cũng đã đóng, vì bạn có thể sử dụng cùng một thủ thuật ở đó.
Kim

3
Trong một bao đóng tôi có thể truy cập một biến theo cùng một cách tôi thường có thể. Điều này đúng với sự đóng cửa của Haskell và Ruby, nhưng không phải là sự thay thế nghèo nàn của Python hay Java. Có lẽ ai đó khác có thể khai sáng cho chúng ta về erlang, tôi không biết rõ về điều đó.
Kim

19

Thật khó để xác định chính xác "ngôn ngữ chức năng" là gì - trong số các ngôn ngữ bạn đã liệt kê, chỉ có Haskell hoàn toàn là chức năng (tất cả các ngôn ngữ khác đều áp dụng một cách tiếp cận hỗn hợp nào đó). Tuy nhiên, có một số tính năng ngôn ngữ rất hữu ích cho lập trình chức năng, và Ruby và Python không có đủ chúng để trở thành môi trường rất tốt cho FP. Dưới đây là danh sách kiểm tra cá nhân của tôi, theo thứ tự quan trọng:

  1. Các hàmđóng cửa hạng nhất (Ruby, Python và tất cả các hàm khác mà bạn liệt kê có cái này).
  2. Đảm bảo tối ưu hóa cuộc gọi đuôi (Erlang, Haskell, Scala và Scheme có điều này, nhưng không phải Python, Ruby hoặc Clojure (chưa)).
  3. Hỗ trợ tính bất biến trong ngôn ngữ và thư viện chuẩn (đây là một ngôn ngữ lớn mà tất cả các "ngôn ngữ chức năng" bạn liệt kê đều có (ngoại trừ Lược đồ) nhưng Ruby và Python thì không).
  4. Hỗ trợ cấp độ ngôn ngữ cho các hàm trong suốt (hoặc thuần túy) tham chiếu (theo như tôi biết, hiện tại chỉ có Haskell có chức năng này).

Nhu cầu về (1) nên rõ ràng - các hàm bậc cao là cực kỳ khó khăn nếu không có các hàm hạng nhất. Khi mọi người nói về Ruby và Python là ngôn ngữ tốt cho FP, họ thường nói về điều này. Tuy nhiên, tính năng đặc biệt này là cần thiết nhưng không đủ để tạo ra một ngôn ngữ tốt cho FP.

(2) là một nhu cầu truyền thống đối với FP kể từ khi Scheme được phát minh. Không có TCO, không thể lập trình với đệ quy sâu, đây là một trong những nền tảng của FP, bởi vì bạn có được ngăn xếp tràn. Ngôn ngữ "chức năng" (theo định nghĩa phổ biến) không có ngôn ngữ này là Clojure (vì các hạn chế của JVM), nhưng Clojure có nhiều cách hack để mô phỏng TCO. (FYI, Ruby TCO là dành riêng cho triển khai , nhưng Python đặc biệt không hỗ trợ nó .) Lý do TCO phải được đảm bảo là nếu nó là đặc thù của triển khai, các hàm đệ quy sâu sẽ bị hỏng với một số triển khai, vì vậy bạn thực sự không thể sử dụng chúng cả

(3) là một điều quan trọng khác mà các ngôn ngữ chức năng hiện đại (đặc biệt là Haskell, Erlang, Clojure và Scala) có mà Ruby và Python không có. Không đi sâu vào chi tiết, tính bất biến được đảm bảo sẽ loại bỏ toàn bộ các lớp lỗi, đặc biệt là trong các tình huống xảy ra đồng thời và cho phép mọi thứ gọn gàng như cấu trúc dữ liệu liên tục . Rất khó tận dụng những lợi ích này nếu không có sự hỗ trợ ở cấp độ ngôn ngữ.

(4), đối với tôi, điều thú vị nhất về các ngôn ngữ hoàn toàn chức năng (trái ngược với các ngôn ngữ lai). Hãy xem xét hàm Ruby cực kỳ đơn giản sau:

def add(a, b)
  a + b
end

Đây trông giống như một hàm thuần túy, nhưng do quá tải toán tử, nó có thể làm thay đổi tham số hoặc gây ra các tác dụng phụ như in ra bàn điều khiển. Không chắc ai đó sẽ làm quá tải +nhà điều hành để có tác dụng phụ, nhưng ngôn ngữ không đảm bảo. (Điều tương tự cũng áp dụng với Python, mặc dù có thể không phải với ví dụ cụ thể này.)

Trong một ngôn ngữ chức năng thuần túy, mặt khác, có các đảm bảo cấp độ ngôn ngữ mà các chức năng được minh bạch tham chiếu. Điều này có nhiều lợi thế: các hàm thuần túy có thể dễ dàng ghi nhớ; chúng có thể dễ dàng được kiểm tra mà không cần dựa vào bất kỳ loại trạng thái toàn cầu nào; và các giá trị trong hàm có thể được đánh giá một cách lười biếng hoặc song song mà không phải lo lắng về các vấn đề tương tranh. Haskell tận dụng tối đa lợi thế này, nhưng tôi không biết đủ về các ngôn ngữ chức năng khác để biết nếu chúng có.

Tất cả những gì đang được nói, có thể sử dụng các kỹ thuật FP trong hầu hết mọi ngôn ngữ (ngay cả Java). Chẳng hạn, MapReduce của Google được lấy cảm hứng từ các ý tưởng chức năng, nhưng theo tôi biết họ không sử dụng bất kỳ ngôn ngữ "chức năng" nào cho các dự án lớn của họ (tôi nghĩ rằng họ chủ yếu sử dụng C ++, Java và Python).


2
+1 cho lời giải thích kỹ lưỡng - ngay cả tôi với tư cách là người ngoài của FP cũng hiểu điều đó. Cảm ơn! :-)
Péter Török

câu trả lời có giá trị nhất cho câu hỏi này cho đến nay. Được thành lập trên thực tế và rất nhiều thông tin. Lam tôt lăm.
wirrbel

Scala có đệ quy đuôi và, như với Scheme, nó được thực hiện tự động nếu một cuộc gọi đệ quy ở vị trí đuôi (không giống như Clojure nơi nó phải được yêu cầu rõ ràng). Thậm chí còn có một chú thích để bạn có thể kiểm tra xem trình biên dịch sẽ tạo mã đệ quy đuôi. Những gì nó không có là TCO tổng quát hơn của Scheme. Tôi giả sử bạn biết điều đó nhưng vì bạn đã đi sâu vào chi tiết về hầu hết những thứ khác, nên điều đó dường như là một sự bỏ qua / bỏ sót kỳ lạ.
itbruce

@itsbruce Bài đăng này khá cũ, IIRC Scala không có nó vào thời điểm đó (hoặc tôi có thể đã sai;). Cập nhật.
shosti

Tôi đã không sử dụng Scala từ đầu nhưng nó đã có đệ quy đuôi vào năm 2008, khi tôi bắt đầu quan tâm ;-) Tôi giới thiệu những người hỏi về chủ đề này cho câu hỏi SO đặc biệt này bởi vì nó có một số câu trả lời hay và tôi chỉ nhận thấy sự kỳ quặc đó, vì vậy nhận xét cho đầy đủ.
itbruce

11

Các ngôn ngữ bạn đề cập rất khác nhau.

Trong khi Python và Ruby là các ngôn ngữ được gõ động, Haskell được gõ tĩnh. Erlang là một ngôn ngữ đồng thời và sử dụng mô hình Diễn viên và rất khác với tất cả các ngôn ngữ khác mà bạn đề cập.

Python và Ruby có nhiều cấu trúc bắt buộc trong khi trong một ngôn ngữ chức năng thuần túy hơn như Haskell, mọi thứ đều trả về một cái gì đó hoặc nói cách khác, mọi thứ đều là một hàm.


@kRON: Chà, hệ thống loại là một thuộc tính quan trọng của ngôn ngữ và anh ấy hỏi "Có gì khác biệt mà các ngôn ngữ lập trình chức năng cụ thể này cung cấp không?". Chắc chắn, bạn có thể sử dụng mô hình Actor với các ngôn ngữ khác nhưng Erlang có nó được tích hợp sẵn trong ngôn ngữ. Erlang sử dụng các quy trình nhẹ và có các cấu trúc ngôn ngữ tích hợp để lập trình phân tán - từ đó trở thành ngôn ngữ "đồng thời".
Jonas

8

Đến bữa tiệc muộn như thường lệ, nhưng dù sao cũng sẽ nói.

Một ngôn ngữ lập trình chức năng không phải là ngôn ngữ cho phép lập trình chức năng. Nếu chúng ta đi theo định nghĩa đó, thì hầu như bất kỳ ngôn ngữ nào ở bất cứ đâu cũng là ngôn ngữ lập trình chức năng. (Tình cờ cũng áp dụng cho OOP. Bạn có thể viết theo kiểu OOP bằng C nếu bạn thích. Do đó, theo logic của bạn, C là ngôn ngữ OOP.)

Điều làm cho một ngôn ngữ lập trình chức năng không phải là thứ cho phép bạn lập trình như thế, nó là thứ cho phép bạn lập trình dễ dàng . Đó là chìa khóa.

Vì vậy, Python có lambdas (là những vấn đề giống như đóng cửa cực kỳ thiếu máu) và cung cấp cho bạn một vài chức năng thư viện mà bạn sẽ thấy trong các thư viện chức năng cũng như "bản đồ" và "gấp". Tuy nhiên, điều này không đủ để biến nó thành ngôn ngữ lập trình chức năng, bởi vì khó có thể không nhất quán lập trình theo một kiểu chức năng phù hợp trong đó (và ngôn ngữ chắc chắn không thực thi phong cách này!). Về cốt lõi, Python là một ngôn ngữ bắt buộc liên quan đến các hoạt động thao túng trạng thái và trạng thái và điều này chỉ đơn giản là mâu thuẫn với ngữ nghĩa đánh giá biểu thức và biểu thức của một ngôn ngữ chức năng.

Vậy tại sao chúng ta có ngôn ngữ lập trình chức năng khi Python (hoặc Ruby (hoặc chèn ngôn ngữ bạn chọn)) có thể "thực hiện lập trình chức năng"? Bởi vì Python, et al không thể lập trình chức năng thích hợp. Đó là lý do tại sao.


6

Bạn có thể thực hiện lập trình chức năng trong Java (xem ví dụ: http://feftaljava.org/ ). Bạn cũng có thể làm lập trình hướng đối tượng trong C . Nó không phải là thành ngữ.

Vì vậy, thực sự chúng tôi không hoàn toàn cần Erlang, Haskell, Scheme, hoặc bất kỳ ngôn ngữ lập trình cụ thể, nhưng tất cả đều thể hiện cách tiếp cận khác nhau và khác nhau thỏa hiệp, làm cho một số nhiệm vụ dễ dàng hơn và một số khó khăn hơn. Những gì bạn nên sử dụng phụ thuộc vào những gì bạn muốn đạt được.


4

Câu hỏi này có thể được áp dụng cho vô số ngôn ngữ và mô thức.

  • Vì mọi người đều sử dụng C ++, tại sao chúng ta cần bất kỳ ngôn ngữ có mục đích chung nào khác?
  • Vì java là một ngôn ngữ OO tuyệt vời như vậy, tại sao các ngôn ngữ OO khác tồn tại?
  • Vì perl là một ngôn ngữ kịch bản tuyệt vời, tại sao chúng ta cần python?
  • Yatta, Yatta, Yatta

Hầu hết, nếu không phải tất cả các ngôn ngữ tồn tại vì một lý do cụ thể. Chúng tồn tại bởi vì ai đó có nhu cầu mà không có ngôn ngữ hiện tại được lấp đầy, hoặc được lấp đầy kém. (Tất nhiên điều này không áp dụng cho mọi ngôn ngữ, nhưng tôi cảm thấy nó áp dụng cho hầu hết các ngôn ngữ nổi tiếng.) Ví dụ, python ban đầu được phát triển để giao tiếp với Amoeba OS [ 1 , 2 ] và Erlang được tạo ra để trợ giúp trong sự phát triển của các ứng dụng điện thoại [ 3 ]. Vì vậy, một câu trả lời cho câu hỏi "Tại sao chúng ta cần một ngôn ngữ chức năng khác?" đơn giản là có thể, bởi vì [insert-name-of-someone-who-know-how-to-design-Languages] không giống như cách con trăn đã làm điều đó.

Đó là tổng hợp khá nhiều những gì tôi nghĩ rằng câu trả lời là. Trong khi bạn có thể làm bất cứ điều gì với python mà bạn có thể làm với một ngôn ngữ chức năng, bạn có thực sự muốn không? Tất cả mọi thứ bạn có thể làm trong C, bạn có thể làm trong lắp ráp, nhưng bạn có muốn không? Các ngôn ngữ khác nhau sẽ luôn tốt nhất để làm những việc khác nhau, và đó là cách nó phải như vậy.


2

Lập trình chức năng cũng giống như một mô hình thiết kế cũng như về các tính năng ngôn ngữ cụ thể. Hoặc, nói cách khác, lambdas và chức năng bản đồ không phải là ngôn ngữ lập trình chức năng. Python và Ruby có một số tính năng lấy cảm hứng từ các ngôn ngữ lập trình chức năng, nhưng bạn vẫn thường viết mã theo một cách rất cấp bách. (Nó giống như C: bạn có thể viết mã giống OO bằng C, nhưng không ai nghiêm túc coi C là ngôn ngữ OO.)

Nhìn: lập trình chức năng không chỉ là về lambdas, hoặc map, hoặc các hàm bậc cao hơn. Đó là về thiết kế . Một chương trình được viết bằng ngôn ngữ lập trình chức năng "thật" sẽ giải quyết các vấn đề thông qua thành phần của các chức năng. Mặc dù các chương trình được viết bằng Ruby hoặc Python có thể sử dụng các tính năng giống như FP, nhưng chúng thường không đọc giống như một tập hợp các hàm tổng hợp.


0

Mỗi ngôn ngữ chức năng mà bạn đề cập phù hợp với một phân khúc nhất định khá tốt và các mẫu thành ngữ mà mỗi loại khuyến khích làm cho chúng rất phù hợp cho một số nhiệm vụ nhất định không thể thực hiện được trong Python trừ khi bạn xây dựng một thư viện mô-đun trợ giúp khổng lồ. Rõ ràng nhất của một sự xuất sắc thích hợp như vậy là mô hình đồng thời của Erlang. Những người khác cũng có điểm mạnh tương tự.


0

Mọi khái niệm có sẵn trong lambda-compus, LISP và Scheme đều có sẵn trong Python, vì vậy, vâng, bạn có thể thực hiện lập trình chức năng trong đó. Nếu nó thuận tiện hay không là vấn đề bối cảnh và hương vị.

Bạn có thể dễ dàng viết trình thông dịch LISP (hoặc ngôn ngữ chức năng khác) bằng Python (Ruby, Scala) (số tiền đó là bao nhiêu?). Bạn có thể viết một trình thông dịch cho Python bằng cách sử dụng chức năng hoàn toàn, nhưng nó sẽ tốn rất nhiều công sức. Ngay cả các ngôn ngữ "chức năng" là đa mô hình ngày nay.

Cuốn sách cũ và đẹp này có hầu hết (mặc dù không phải tất cả) các câu trả lời về bản chất của lập trình chức năng là gì.


@Arkaaito Nhưng bạn có đồng ý rằng mọi khái niệm có sẵn trong phép tính lambda, LISP và Lược đồ đều có sẵn trong Python không?
Đánh dấu C

Bạn có chắc chắn rằng mọi khái niệm lisp đều có sẵn trong Python? Macro, mã là dữ liệu?
SK-logic

@ Macro SK-logic không có trong lambda-tính toán, nhưng vâng, chúng có sẵn trong Python, mặc dù không có tên đó. Python cung cấp một eval()hàm, thứ cần thiết cho mã là dữ liệu , nhưng nó còn đi xa hơn: nó cho phép bạn sửa đổi hầu hết môi trường thời gian chạy, như trong LISP.
Apalala

@Apalala, ngôn ngữ động eval()là một siêu lập trình thời gian chạy. Đôi khi nó hữu ích, nhưng nó cực kỳ tốn kém. Các macro Lisp là khác nhau, nó là một siêu lập trình thời gian biên dịch. Nó không có sẵn trong Python dưới mọi hình thức có thể sử dụng.
SK-logic

@ SK-logic Loại macro đó phá vỡ tiền đề mã-dữ liệu , vì các chương trình không thể thay đổi macro (hoặc thậm chí biết về sự tồn tại của chúng). Trong Python, các chương trình có quyền truy cập vào các cây phân tích cú pháp của riêng chúng khi chạy, nếu chúng cần chúng. Macro (tiền xử lý tĩnh) hoàn toàn không hoạt động.
Apalala

-5

Bởi vì Python cũng có thể lập trình theo kiểu phi chức năng và điều đó không đủ tốt cho người thuần túy FP. Mặc dù vậy, các lập trình viên thực dụng hơn có thể tận hưởng những lợi ích của phong cách chức năng mà không bị giáo điều về nó:

Các lập trình viên chức năng nghe có vẻ giống như một nhà sư thời trung cổ, phủ nhận bản thân những thú vui của cuộc sống với hy vọng rằng nó sẽ làm cho anh ta có đạo đức. Đối với những người quan tâm nhiều hơn đến lợi ích vật chất, những lợi thế trên nền tảng này không phải là rất thuyết phục. Các lập trình viên chức năng lập luận rằng có những lợi ích vật chất rất lớn [nhưng] điều này thật vô lý. Nếu bỏ qua các câu lệnh gán mang lại lợi ích to lớn như vậy thì các lập trình viên FORTRAN đã làm điều đó trong hai mươi năm. Đó là một sự bất khả thi về mặt logic để làm cho ngôn ngữ trở nên mạnh mẽ hơn bằng cách bỏ qua các tính năng, bất kể chúng có thể tệ đến mức nào.

- John Hughes, Tại sao lập trình chức năng lại quan trọng


6
Tôi đồng ý. Bất kỳ ngôn ngữ mà không có gotolà khủng khiếp.
Anon.

2
@Anon: Hoặc anh chị lớn của nó , call-with-current-continuation.
Chris Jester-Young

4
Mason, tờ giấy bạn đang trích dẫn đang nói hoàn toàn ngược lại. Trích dẫn của bạn chỉ là một đoạn của một vài đoạn của một bài báo kể một câu chuyện khác nhau. Trong thực tế, nếu bạn trích dẫn cả hai đoạn nói chung, chúng sẽ hiển thị rõ ràng một ý nghĩa khác.
Marco Mustapic

2
@Mason: có, tác giả tuyên bố mô đun hóa và đánh giá lười biếng là những lợi ích thực sự. Nhưng lưu ý cách trích dẫn ban đầu của bạn nằm ngoài ngữ cảnh - bạn dường như đề nghị tác giả đang tuyên bố điều gì đó chống lại FP, trong khi thực tế bạn đã trích dẫn một đoạn từ một bài báo với kết luận rằng FP rất tuyệt, chỉ vì lý do sai lệch của " càng đơn giản càng đẹp". Tiêu đề của bài báo cho thấy ý định của tác giả khá rõ ràng: "tại sao lập trình chức năng lại quan trọng" ;-) Nó chắc chắn không hỗ trợ cho tuyên bố của bạn rằng các languanges thuần túy "là một mối phiền toái".
Andres F.

6
@Mason Wheeler: Các ngôn ngữ lai tạo trước Python bằng một đoạn loooooong. Lisp, ví dụ, có từ năm 1959 và trên thực tế, là một ngôn ngữ đa mô hình. Nó hỗ trợ đầy đủ các phương pháp tiếp cận chức năng, phương pháp tiếp cận thủ tục và phương pháp tiếp cận hướng đối tượng để lập trình. Với các gói macro phù hợp trên đầu trang, bạn cũng có thể lập trình logic khá dễ dàng. Lược đồ cũng vậy, trước Python (và bài báo này). Nó quay trở lại năm 1975. Đôi khi bạn nên lướt qua dòng thời gian của ngôn ngữ lập trình này .
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI đúng
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.