Những thách thức và lợi ích của việc viết trò chơi với một ngôn ngữ chức năng là gì?


81

Mặc dù tôi biết rằng các ngôn ngữ chức năng không được sử dụng phổ biến nhất để viết trò chơi, nhưng có rất nhiều lợi ích liên quan đến chúng mà dường như chúng sẽ thú vị trong bất kỳ bối cảnh lập trình nào. Đặc biệt là sự dễ dàng song song hóa tôi nghĩ có thể rất hữu ích vì sự tập trung đang hướng tới ngày càng nhiều bộ xử lý.

Ngoài ra, với F # là thành viên mới của gia đình .NET, ví dụ, nó có thể được sử dụng trực tiếp với XNA, làm giảm ngưỡng khá nhiều, trái ngược với việc đi với LISP, Haskell, Erlang, v.v.

Nếu bất cứ ai có kinh nghiệm viết trò chơi với mã chức năng, điều gì đã trở thành tích cực và tiêu cực? Nó phù hợp với cái gì, cái gì không?

Chỉnh sửa: Tìm kiếm thật khó để quyết định rằng có một câu trả lời tốt cho vấn đề này, vì vậy có lẽ nó phù hợp hơn với tư cách là một bài đăng wiki cộng đồng.


3
với một trong những trò chơi yêu thích của tôi (Rogue) được viết bằng LISP, câu hỏi này (và tiềm năng trả lời của nó) rất thú vị đối với tôi.
Justin L.

Không biết Rogue được viết bằng LISP, nhưng thấy thú vị. Trò chơi cổ điển. :)
McMuttons

2
Không chắc chắn những gì bạn đang nói về. Rogue được viết trong C. roguebasin.roguelikedevelopment.org/index.php?title=Rogue
Mason Wheeler

2
Tôi chắc chắn rằng bạn đúng về Rogue gốc ở C, vì nó được viết trên Unix, nhưng chắc chắn có một số bản sao Rogue trong Lisp: cl-user.net/asp/root-dir (không phải là liên kết Trò chơi trực tiếp , nó có quá nhiều ký tự đặc biệt, dường như nó đã bị đứt liên kết).
Cyclops

Câu trả lời:


57

Tôi hiện đang làm việc trên một trò chơi ở Haskell. Tôi không thể nói về lập trình chức năng nói chung, nhưng đối với Haskell cụ thể:

Tốt

Đây là những điều tuyệt vời làm cho Haskell thực sự nổi bật.

  • Độ tinh khiết có nghĩa là lý do về mã của bạn dễ dàng hơn rất nhiều. Bạn không phải lo lắng về giá trị "hiện tại" của một biến hoặc việc sử dụng một hàm nhất định sẽ xung đột với trạng thái toàn cầu của bạn theo một cách nào đó. Điều đó cũng có nghĩa là tính song song và đồng thời dễ dàng hơn để làm việc với (và trong nhiều trường hợp, tầm thường). Những điều này có thể là một ơn trời cho các nhà phát triển trò chơi.
  • Haskell làm cho nó rất dễ dàng để viết ở mức rất cao bằng cách sử dụng sự trừu tượng của sáng tạo của riêng bạn. Việc viết mã rất chung chung thường dễ hơn mã chuyên dụng trong Haskell và lợi ích của bản kê khai này trong thời gian phát triển ít hơn và hiểu mã dễ dàng hơn. Điều đó đúng với Haskell hơn bất kỳ ngôn ngữ nào khác mà tôi biết rằng việc sử dụng giao diện cũng giống như sử dụng một ngôn ngữ hoàn toàn mới (trong khi vẫn giữ được lợi ích của phần còn lại của hệ sinh thái Haskell). Điều mà hầu hết các ngôn ngữ gọi là các tính năng ngôn ngữ, Haskell gọi là một thư viện và nó không cảm thấy bị ép buộc. Nếu bạn từng thấy mình suy luận về trò chơi của mình trong psuedocode, có lẽ bạn chỉ cần viết một giao diện đơn giản và biến nó thành mã thật, và nó thường đáng để làm điều đó.
  • Điều này có thể mâu thuẫn với các câu trả lời khác, nhưng Haskell xử lý mã bắt buộc tốt hơn bất kỳ ngôn ngữ nào khác mà tôi biết. Các ràng buộc của độ tinh khiết có nghĩa là Haskell có sự tách biệt giữa các khái niệm "đánh giá" (giảm biểu thức) và "thực thi" (thực hiện các tác dụng phụ). Bạn có thể kiểm soát thời gian và cách các hiệu ứng phụ được thực hiện một cách dễ dàng bằng các ngôn ngữ được gọi là "bắt buộc". Bất chấp những gì tôi đã nói về độ tinh khiết trước đó, một số ràng buộc C vẫn rất bắt buộc (OpenGL, tôi đang nhìn vào bạn), vì vậy việc kiểm soát chi tiết này đối với mã mệnh lệnh rất đáng hoan nghênh. Ngay cả những lập trình viên C dày dạn nhất cũng có khả năng đánh giá cao nó một khi họ đã quen với nó.
  • GHC tạo ra các nhị phân khá nhanh. Họ không phải là nhanh như mã nhị phân được tạo ra từ các trình biên dịch C thông thường, nhưng nằm trong một thứ tự của tầm quan trọng, và là xa nhanh hơn so với những gì bạn sẽ đạt được với một ngôn ngữ giải thích. Ngay cả khi bạn không thể viết trò chơi của mình bằng các ngôn ngữ cấp cao khác như Python vì nó quá chậm, vẫn có cơ hội tốt để bạn có thể làm điều đó trong Haskell.
  • Mặc dù không có nhiều thư viện liên quan đến trò chơi trong Haskell, như được lưu ý trong phần "The Bad" bên dưới, giao diện chức năng nước ngoài của Haskell là giao diện đơn giản nhất tôi từng sử dụng. Bạn có thể liên kết với C bằng cách viết gần như độc quyền trong Haskell.

Những người xấu

Đây là những điều không tốt nhưng có thể được giải quyết mà không cần quá nhiều nỗ lực.

  • Thời gian và nỗ lực cần thiết để học Haskell có thể khá cao nếu bạn rất quen làm việc với các ngôn ngữ phi chức năng. Bản thân ngôn ngữ không quá khó, nhưng khi bạn tính đến các phần mở rộng ngôn ngữ phổ biến và số lượng thư viện khổng lồ (hãy nhớ rằng, nhiều thứ bạn có thể coi là các tính năng ngôn ngữ trong các ngôn ngữ khác là thư viện trong Haskell), nó có vẻ đáng ngại hơn nhiều. Theo tôi, nó đáng giá, nhưng những người khác có thể không đồng ý.
  • Một số người phàn nàn về sự lười biếng rất nhiều. Nếu bạn biết những gì bạn đang làm, bạn sẽ không gây ra rò rỉ không gian khó theo dõi (Tôi đã không tạo ra rò rỉ không gian trong một vài năm nay), nhưng những người mới bắt đầu gặp nhiều rắc rối hơn với điều này. Sẽ thật ngu ngốc khi tôi bắn hạ những người này và cho rằng đây không phải là vấn đề, nhưng tôi sẽ khẳng định rằng đó là một vấn đề dễ dàng được giải quyết bằng kinh nghiệm.
  • Không có nhiều thư viện tuyệt vời để tạo trò chơi trong Haskell và không có nhiều người Haskeller viết trò chơi trong đó, vì vậy rất khó để tìm tài nguyên và trợ giúp về vấn đề này.

Xấu xí

Đây là những điều sẽ cần nỗ lực đáng kể để vượt qua.

  • Nếu bạn đang viết một trò chơi chuyên sâu về tài nguyên, trình thu gom rác của GHC có thể sẽ cắn bạn khá nhiều. Đó là một thế hệ GC, thế giới dừng, vì vậy thỉnh thoảng bạn có thể thả một vài khung hình. Đối với một số game thì không sao, nhưng với những game khác thì đó là một vấn đề lớn. Tôi và một số nhà phát triển trò chơi khác sử dụng Haskell muốn thấy một GC thời gian thực được triển khai cho GHC, nhưng theo tôi thì không có nỗ lực nào dành cho điều đó. Hiện tại, tôi không lo lắng về việc giải quyết vấn đề này (và chưa thấy bất kỳ khung hình nào bị rớt khỏi nó), nhưng ít nhất một nhóm khác đã dùng đến việc đưa vòng lặp kết xuất chính của họ vào C.

2
Bạn nghĩ gì về FRP?
Wei Hu

4
@Wei Hu: Tôi là một fan hâm mộ lớn của ý tưởng về FRP và bản thân tôi đã nghiên cứu nó khá rộng rãi, bao gồm tạo ra một vài ngữ nghĩa khác nhau và viết một vài triển khai. Việc triển khai tốt nhất vẫn có lỗi ngữ nghĩa và / hoặc lỗi thực thi nghiêm trọng. Tôi sẽ nói rằng họ có khả năng phát triển trò chơi, nhưng không có nhiều lợi thế (chưa) so với các phương pháp truyền thống.
Jake McArthur

1
Một người dùng ẩn danh đã cố gắng chỉnh sửa câu trả lời này để xóa phần "xấu xí". "Trình thu gom rác ở Haskell hiện đồng thời, song song và thế hệ kể từ năm 2011 ( ghc.haskell.org/trac/ghc/blog/new-gc-preview )"
Jari Komppa

1
Thật không may, điều đó không thực sự đúng. GC đồng thời được phát hiện là quá phức tạp để chứng minh cho sự cải thiện tổng thể nhỏ và nó đã không được hợp nhất.
Jake McArthur

1
@ Hi-Angel Có một phụ trợ GHC cũ đã tạo C, nhưng nó không khác với trình tạo mã gốc hoặc phụ trợ LLVM. Nó vẫn yêu cầu thời gian chạy GHC. Ngoài ra, không có gì đặc biệt về phụ trợ C sẽ giúp việc tránh bộ thu gom rác dễ dàng hơn. Nếu nó rất dễ dàng và rẻ tiền để loại bỏ GC, thì các phụ trợ khác cũng có thể làm điều đó.
Jake McArthur

19

Tôi đã dành năm ngoái để phát triển một công cụ trò chơi thương mại ở Haskell, và đối với chúng tôi, trải nghiệm này cực kỳ tích cực. Thế giới trò chơi của chúng tôi rất phức tạp và Haskell đã giúp dễ dàng mô hình hóa quá trình chuyển đổi từ định dạng trình chỉnh sửa sang định dạng công cụ trò chơi. Tôi ghét phải nghĩ rằng mã đó sẽ trông như thế nào trong một ngôn ngữ bắt buộc.

Rò rỉ không gian đã xuất hiện và đôi khi chúng gây ra một chút rắc rối, trong sơ đồ chung, nó chỉ là một lượng nhỏ (ví dụ như so với việc tìm kiếm các bế tắc trong các dự án Java có kích thước tương tự) và một khi chúng đã được sửa , họ ở lại cố định.

Chúng tôi đang sử dụng FRP tương tự như Yampa và chắc chắn có một đường cong học tập liên quan đến nó, nhưng một khi đã kết thúc, trải nghiệm này rất tích cực. Thư viện không phải là vấn đề đối với chúng tôi - mọi thứ chúng tôi cần đều có sẵn. Sự chậm trễ thu gom rác là một vấn đề cụ thể vì nó là một nền tảng nhúng. Chúng tôi đã sử dụng một số C ++ để quản lý hoạt hình. Hiệu suất cũng là một vấn đề với việc đây là một nền tảng nhúng (= bộ xử lý chậm). Chúng tôi đã thực hiện một số C và chúng tôi cũng đang xem xét các công nghệ Haskell mới nổi như tăng tốc. Trình hoạt hình C ++ là một quyết định thiết kế từ rất sớm và những nơi mà mã quá chậm chỉ là những khu vực rất nhỏ. Về lâu dài, chúng tôi muốn dịch tất cả từ C sang Haskell.

Haskell đã làm cho một công việc khó khăn trở nên dễ dàng và tất cả những khó khăn tôi vừa đề cập là rất nhỏ so với số lượng lớn mã phức tạp chúng tôi đã tạo ra sạch sẽ, có thể bảo trì và khá nhiều không thể phá vỡ. Song song sẽ là một vấn đề trong phát triển trò chơi rất sớm, và chúng tôi rất hợp để giải quyết nó. Một số điều tôi đã nói có thể không áp dụng cho các dự án nhỏ, bởi vì chúng tôi đang ở đây trong một thời gian dài, vì vậy chi phí khởi nghiệp như học đường cong, hỗ trợ thư viện, v.v., ít vấn đề hơn.


7
Đã gần 5 năm kể từ khi bạn đăng câu trả lời này; bạn sẽ sẵn sàng để cập nhật nó? Làm thế nào các công cụ trò chơi thương mại làm việc ra? Những mảnh được chứng minh là có giá trị? Bạn đã có thể tận dụng sự song song như bạn mong muốn chưa?
Levi Morrison

17

Dave đề cập đến một số điểm tuyệt vời, mặc dù tôi phải chỉ ra rằng Haskell đã giải quyết cả hai vấn đề của mình. Không thể bỏ qua trạng thái không sử dụng đơn vị Bang (EDIT: không thực sự - xem chi tiết bên dưới) và giải trình tự có thể được xử lý bằng cách sử dụng đơn vị IO (EDIT: hoặc bất kỳ đơn vị nào khác, cho vấn đề đó ...) .

Những thách thức bạn sẽ có (và rằng tôi đã cố gắng học cả lập trình trò chơi và Haskell), nằm dọc theo những dòng này. (Tất cả đều dành riêng cho Haskell, vì tôi thực sự chưa đi sâu với bất kỳ ngôn ngữ FP nào khác.)

  • Đường cong học tập của FP: FP đòi hỏi một sự thay đổi hoàn toàn về tư duy từ lập trình lặp. Học cách suy nghĩ về bản đồ và các nếp gấp thay vì các vòng lặp đòi hỏi một sự rèn luyện tinh thần nếu bạn không quen với nó.
  • Đường cong học tập toán học: Haskell vừa được ban phước vừa bị nguyền rủa bởi sự tinh vi toán học của các nhà thiết kế của nó, bởi vì sau khi bạn học những điều cơ bản của FP, bạn bị mắc kẹt với các đơn nguyên, hình thái, mũi tên và một loạt các cân nhắc khác, trong khi không khó khăn trong và của chính họ, rất trừu tượng.
  • Monads: những chú chó con này không đặc biệt khó khăn trong việc che giấu suy nghĩ của bạn, đặc biệt nếu bạn chấp nhận tuyên bố của Eric Raymond rằng chúng là một "hack để biến thành phần chức năng thành một cách để buộc chuỗi các cuộc gọi chức năng." Thật không may (mặc dù điều này đang trở nên tốt hơn khi Haskell trở nên phổ biến), nhiều lời giải thích về các đơn vị nhắm vào đầu của hầu hết các lập trình viên ("họ là những người đơn điệu trong thể loại endofunctor!"), Hoặc ở một sự tương tự hoàn toàn không có ích (ví dụ , Ví dụ chính xác đau khổ của Brent Yorge, "các đơn vị giống như burritos !" Bạn nghĩ rằng anh ta đang đùa? Điều đó không ai có thể đưa ra một sự tương tự ngớ ngẩn như vậy trong một hướng dẫn? Hãy suy nghĩ lại .)
  • Hệ sinh thái: Nếu bạn đã vượt qua được tất cả những va chạm khác trên đường, bạn sẽ phải đối mặt với thực tế hàng ngày khi làm việc với một ngôn ngữ chủ yếu vẫn là thử nghiệm. Chúa giúp bạn khi bạn đến đây. Đây là nơi tôi bắt đầu phân tích nghiêm túc cho Scala, hoặc F #, hoặc một số ngôn ngữ khác, nơi có ít nhất một số đảm bảo về khả năng tương tác với các thư viện khác. Ngày xửa ngày xưa, tôi có Haskell để liên kết và tải các thư viện OpenGL trong Windows. Điều đó làm cho tôi cảm thấy khá tốt. Sau đó, các ràng buộc OpenGL được phát hành lại và phá vỡ mọi thứ tôi đã làm. Đó là cuộc sống ở vùng đất Haskell. Thành thật mà nói, nó có thể là một nỗi đau. Bạn muốn một trình bao bọc cho công cụ Bullet? Đó là trong Hackage - như là phần mềm bỏ rơitừ tháng 11 năm ngoái. Bạn thích Ogre3d? Hackage có các ràng buộc chỉ là một tập hợp con của thư viện . Điểm mấu chốt là nếu bạn sử dụng một ngôn ngữ ngoài con đường phát triển trò chơi, bạn sẽ mất nhiều thời gian hơn để làm việc với hệ thống ống nước cơ bản hơn bạn nếu bạn chỉ theo đàn và bị mắc kẹt với C ++.

Mặt trái của điều này là mọi thứ đang được cải thiện nhanh chóng. Và nó thực sự phụ thuộc vào những gì bạn muốn từ trải nghiệm. Bạn muốn xây dựng một trò chơi và đưa nó lên trang web của bạn để tìm kiếm danh tiếng và vận may? Gắn bó với C ++ hoặc Python. Nhưng nếu bạn muốn học một cái gì đó mới sẽ yêu cầu bạn đổi mới quy trình của mình, hãy thử một ngôn ngữ chức năng. Chỉ cần có nhiều kiên nhẫn với bản thân trong khi học.

Antti Salonen có một blog thú vị mô tả chi tiết về mối quan hệ của mình với lập trình trò chơi Haskell. Nó đáng để đọc.

Chỉnh sửa (một năm sau): Bây giờ tôi đã nghiên cứu về đơn vị Nhà nước nhiều hơn, tôi nhận ra rằng đó không phải là một giải pháp đặc biệt tốt cho trạng thái dự định tồn tại bên ngoài một chức năng cụ thể. Các giải pháp thực sự cho trạng thái không trạng thái được tìm thấy trong Haskell ở IOVar, ST, MVar (để đảm bảo an toàn cho luồng) hoặc thông qua một cái gì đó như Yampa, sử dụng Arbow và FRP để quản lý trạng thái nội bộ mà dù sao cũng bị ẩn khỏi nhà phát triển. (Danh sách này theo thứ tự độ khó, mặc dù ba phần đầu không đặc biệt khó khi bạn hiểu được các đơn nguyên.)


1
Một số suy nghĩ tốt ở đó, ngay cả khi khá cụ thể Haskell, tôi nghĩ đó là những suy nghĩ áp dụng cho hầu hết các ngôn ngữ bên lề. Như bạn đã đề cập ngắn gọn, tôi nghĩ đây là nơi các ngôn ngữ như F # có khả năng tỏa sáng. Xử lý trạng thái / UI bằng C #, ví dụ, sau đó có các mô-đun logic trong F # cho các thuật toán như tìm đường dẫn tiềm năng, AI, v.v.
McMuttons

5

Caml khách quan!

Sử dụng các ngôn ngữ chức năng có thể là một lợi thế rất lớn trong hầu hết các loại phát triển phần mềm, chủ yếu là do chúng cắt giảm đáng kể thời gian phát triển. Tôi có thể thấy một tiềm năng lớn để viết phần cuối máy chủ cho trò chơi, hoặc các lớp logic và AI trên máy khách, bằng ngôn ngữ chức năng. Và như mọi người đều biết, LISP đã được sử dụng cho kịch bản NPC.

Nếu tôi cố gắng viết frontend của một trò chơi bằng ngôn ngữ chức năng, tôi chắc chắn sẽ chọn Objective Caml , một ngôn ngữ lai. Đó là hậu duệ ML và cho phép kết hợp các kiểu lặp và chức năng, có một hệ thống khách quan với các đối tượng trạng thái. (Caml là ngôn ngữ mà F # được mô hình hóa.)

Các ràng buộc OpenGL dường như hoạt động hoàn hảo và mọi người đã tạo ra các trò chơi trong OCaml trong một thời gian dài. Ngôn ngữ có thể được biên dịch và có khả năng rất nhanh (ngôn ngữ này nổi tiếng so với C ở một số điểm chuẩn trong một thời gian dài trước đây, đừng để mọi thứ trở nên như bây giờ).

Ngoài ra còn có hàng tấn thư viện. Tất cả mọi thứ từ khoa học máy tính đến các ràng buộc cho tất cả các loại thư viện.


4

Không thực sự là một câu trả lời cho bất cứ điều gì, nhưng tôi cảm thấy như một cuộc thảo luận về lập trình trò chơi bằng các ngôn ngữ chức năng chưa hoàn chỉnh mà không đề cập đến Lập trình phản ứng chức năng (FRP) - http://www.haskell.org/frp/ - và cách triển khai phổ biến nhất của nó ( Tôi nghĩ sao?), YAMPA - http://www.haskell.org/yampa/ .


3

Về lợi ích, hãy xem Thư viện trò chơi sạch (http://cleangl.sourceforge.net/) và kiểm tra trò chơi platformer. Khi bạn hiểu được cú pháp (tôi khuyến khích bạn thử), bạn sẽ thấy sự thanh lịch tuyệt đối của các cấu trúc và mức độ ánh xạ nguồn đến các khái niệm mà chúng thể hiện. Là một phần thưởng bổ sung, sự trừu tượng của trạng thái và sự cần thiết phải vượt qua trạng thái một cách rõ ràng, làm cho mã của bạn trở nên thân thiện hơn nhiều.

Mặt khác, nó đòi hỏi một sự thay đổi mô hình chính. Rất nhiều điều bạn đã từng làm mà không nghĩ về nó đột nhiên không còn tồn tại nữa và bạn sẽ bối rối không biết làm thế nào để giải quyết nó, đơn giản chỉ vì bạn đang suy nghĩ sai.


2

Theo quan điểm của tôi, những thách thức lớn nhất sẽ là:

  • Không trạng thái của ngôn ngữ chức năng: Ý tưởng trong các trò chơi là mỗi thực thể có một trạng thái và trạng thái này đang được sửa đổi từ khung này sang khung khác. Có những cơ chế để bắt chước hành vi đó trong một số ngôn ngữ (ví dụ như các hàm với "!" Trong sơ đồ plt) nhưng nó cảm thấy không tự nhiên.
  • Thứ tự thực hiện : Trong các trò chơi, một số phần mã phụ thuộc vào các phần mã khác được hoàn thành trước khi thực hiện. Các ngôn ngữ hàm nói chung không đảm bảo về thứ tự thực hiện các đối số của hàm. Có nhiều cách để bắt chước hành vi này (ví dụ " (begin..." trong sơ đồ plt).

Vui lòng mở rộng danh sách này (và có thể thêm một số điểm tích cực ^^).


1
Thứ tự thực hiện có thể khác nhau trong ngôn ngữ không nghiêm ngặt như Haskell nhưng nó không gây ra sự cố cho các phần mã phụ thuộc vào các phần mã khác. Bạn có thể nghĩ về nó như là đánh giá theo yêu cầu. Một tính toán không được thực hiện cho đến khi kết quả là cần thiết. Tôi nghĩ rằng cách duy nhất nó có thể khiến bạn đau buồn là về hiệu suất. Ví dụ, trong một số trường hợp, có thể khó có được bộ nhớ đệm tốt vì bạn sẽ không kiểm soát thứ tự đánh giá ngoài việc chỉ định các phụ thuộc giữa các tính toán.
Jason Dagit

1

Bạn có thể viết mã của mình bằng C / C ++ và sử dụng ngôn ngữ được nhúng như Embedded Common Lisp cho tập lệnh của bạn. Mặc dù có được những thứ này để biên dịch trên một nền tảng khác có thể khó khăn. Bạn có thể nhìn vào Lisp In Pieces để tìm hiểu cách viết ngôn ngữ kịch bản của riêng bạn. Nó thực sự không khó lắm, nếu bạn có thời gian.


0

Tôi đã viết các trò chơi đơn giản trong LISP và nó rất vui nhưng không phải là thứ tôi muốn giới thiệu. Lập trình chức năng là tất cả về kết quả cuối cùng. Vì vậy, nó rất thuận tiện để xử lý dữ liệu và đưa ra quyết định nhưng tôi thấy nó khó thực hiện mã sạch đơn giản như một vòng điều khiển cơ bản.

Tôi chưa học F # mặc dù vậy có thể làm việc với nó dễ dàng hơn nhiều.


Suy nghĩ ban đầu của tôi có thể là viết giàn giáo và xử lý trạng thái bằng một ngôn ngữ bắt buộc, sau đó thực hiện logic trò chơi và như vậy với các bit chức năng. Với .NET và C # / F #, điều này sẽ rất dễ dàng, ví dụ, vì họ sử dụng cùng một thư viện và có thể nói chuyện với nhau mà không có hình phạt thực sự mà tôi biết.
McMuttons

-1

tích cực sẽ là hiệu suấttính di động và tiêu cực sẽ quản lý sự phức tạp , trò chơi ngày nay rất phức tạp và cần các công cụ hoặc ngôn ngữ lập trình có thể quản lý sự phức tạp tốt hơn, như phương pháp hướng đối tượng hoặc lập trình chung khó thực hiện trong lập trình chức năng ngôn ngữ.


11
Bạn đang đùa tôi à FP là chương trình chung về steroid. Việc có thể khái quát cả hai loại dữ liệu chức năng mang lại cho FP sức mạnh nghiêm trọng để quản lý sự phức tạp.
rtperson

Tôi đồng ý, một trong những thế mạnh lớn nhất của FP là khả năng làm mã tổng quát.
McMuttons
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.