Tại sao tất cả các hướng dẫn lập trình chức năng rất toán học?


20

Tôi đã cố gắng học lập trình chức năng và hầu hết các hướng dẫn tôi đã thấy sử dụng toán học làm ví dụ cho các cấu trúc phức tạp hơn (ngay cả những cái đơn giản trong một số trường hợp). Tại sao lại thế này? Tôi sẽ tưởng tượng một cái gì đó dễ dàng hơn có thể được sử dụng. Nó làm cho nó khó học.

Thông tin cơ bản: Tôi đã viết phần mềm được 12 năm. Tôi hiểu một số khái niệm như đóng cửa, chức năng như công dân hạng nhất và thuốc generic. Tôi có thể gặp vấn đề với các chức năng bậc cao hơn ở một số cấp độ nâng cao, nhưng tôi muốn tin rằng tôi có một nắm bắt cơ bản. Monads đang cắn vào mông tôi, và tại thời điểm này tôi đã không vượt qua được điều đó (tôi chắc chắn cuối cùng tôi sẽ làm được, bởi vì tôi kiên trì).


chỉ một chút thôi, tôi đã không thử 3 ngôn ngữ khác mà bạn đề xuất
Charles Lambert

F # là thứ dễ nhất để bắt đầu nếu bạn biết C #. Không yêu cầu kiến ​​thức toán học lớn.
cnd

6
Hãy thử SICP - nó không vượt quá môn toán ở trường trung học.
SK-logic

@Charles Lambert - Hãy xem OfficeSpace và bạn sẽ nhận được phần thứ hai của nhận xét của Công việc.
Jetti

@ Charles Lambert: Tìm hiểu cho bạn một Haskell cho Great Good không quá toán học: D
Matthieu M.

Câu trả lời:


21

Họ sử dụng toán học vì Lập trình hàm rất giỏi trong việc mô hình hóa các cấu trúc toán học và rất gắn liền với các khái niệm toán học, đặc biệt là Lambda Tính. Ngoài ra, vì I / O thường là một môn học khá gai góc và tiên tiến trong nhiều ngôn ngữ của toán học mô hình chức năng thông qua REPL của các ngôn ngữ khác nhau trở thành một cách tốt để dạy ngôn ngữ lúc đầu.

Bởi vì Lập trình hàm xử lý các Hàm như các cấu trúc lớp đầu tiên trong ngôn ngữ lập trình, việc tạo hàm trở nên rất quan trọng. Do đó toán cao hơn trở nên khá quan trọng đặc biệt là lý thuyết đồ thị.

Ngôn ngữ mệnh lệnh cũng giống như toán học, nhưng tất cả đều là cơ sở vì nó gần với máy hơn mà chỉ có thể thêm vào. Các ngôn ngữ chức năng với sự trừu tượng cao hơn của chúng có xu hướng nhiều hơn về toán học. Việc sử dụng chung trong học viện không giúp ích gì khi chúng được sử dụng và do đó được dạy bởi những người biết nhiều toán học và đang dạy cho những người mong đợi học được nhiều toán. Vì vậy, có thể "câm nó xuống" để nói nhưng không chắc là có các yếu tố này.

http://learnyouahaskell.com/ - Có lẽ là một trong những lời giới thiệu nhẹ nhàng nhất về Lập trình hàm, tôi đã kiểm tra lại và không có gì ngoài lý thuyết đại số và đồ thị cơ bản trong đó.


learnyousomeerlang.com cũng là một lựa chọn nếu bạn muốn một cái gì đó khác ngoài Haskell.
Travis

11

Có rất nhiều lý do, và tất cả chúng đều liên quan đến nhau:

  • Hầu hết các ngôn ngữ lập trình chức năng được phát triển trong bối cảnh học thuật, trong đó CS liên kết chặt chẽ với Toán học, vì vậy những người thiết kế chúng có nền tảng Toán học mạnh mẽ (và có xu hướng giả định giống nhau về đối tượng của họ)
  • Lập trình hàm là một mô hình đặc biệt phù hợp để giải các bài toán nặng
  • Lý thuyết đằng sau FP, phép tính lambda (về cơ bản, một lý thuyết trừu tượng về các hàm), là một nhánh của Toán học và các ngôn ngữ FP có xu hướng sử dụng các khái niệm và thuật ngữ từ phép tính lambda

Ngoài ra, FP không thực sự là toán học nhiều hơn các mô hình khác, nhưng các khái niệm chính (chức năng như công dân hạng nhất thực sự, chức năng bậc cao, đóng cửa và độ tinh khiết) đòi hỏi một tư duy nhất định. Tại một số điểm, tâm trí của bạn nên đi "nhấp chuột"; Nếu bạn hiểu 4 ý tưởng cốt lõi này, phần còn lại có thể sẽ dễ dàng như bất kỳ mô hình nào khác.


3
+1 cho phát triển trong giới hàn lâm: mọi người tạo ra các ngôn ngữ chức năng dựa trên các thuộc tính toán học, vì vậy nó bị rò rỉ ...
Matthieu M.

@Matthieu M: Dựa trên ngôn ngữ lập trình về các thuộc tính toán học giúp viết phần mềm chính xác và giảm thời gian phát triển. Ví dụ, tôi chắc chắn dành ít thời gian để gỡ lỗi mã Haskell hơn mã C ++ của mình. Giảm thời gian phát triển (và chi phí) là một lợi thế thực tế rất lớn có thể biện minh cho nỗ lực học một số môn toán. Như tdammers đã chỉ ra, có một vài khái niệm cần phải học nhưng sau khi bạn đã hiểu một vài ý tưởng cốt lõi thì FP cũng trực quan như lập trình bắt buộc.
Giorgio

Tôi cũng đồng ý với các tdammers rằng các ngôn ngữ mệnh lệnh cũng có thể được mô tả bằng các khái niệm toán học. Trong thực tế, một mô tả toán học của một chương trình mệnh lệnh thường phức tạp hơn nhiều so với mô tả toán học của một chương trình chức năng. IMO điều này giải thích tại sao các ngôn ngữ mệnh lệnh có nhiều khả năng chứa lỗi: khó hiểu hơn về mã mệnh lệnh. Ít nhất, đây là kinh nghiệm cá nhân của tôi với một vài năm lập trình chức năng và nhiều năm nữa lập trình bắt buộc.
Giorgio

@Giorgio: có một sự khác biệt giữa "rò rỉ vào ngôn ngữ" (bằng cách nào đó) và "rò rỉ vào hướng dẫn". Tôi khá chắc chắn rằng bạn có thể viết hướng dẫn lập trình chức năng mà không cần quá nhiều toán học trong đó. Tất nhiên liệu họ có tốt hơn hay không là tùy tranh luận và có thể chủ quan.
Matthieu M.

@MatthieuM.: Cảm ơn rất nhiều vì đã làm rõ ý của bạn bằng cách rò rỉ (rò rỉ vào hướng dẫn): bình luận của bạn có ý nghĩa hơn đối với tôi bây giờ. Tôi đồng ý với bạn rằng một hướng dẫn về FP nên chứa ít toán học nhất có thể. Tôi đã giải thích sai bằng cách nào đó nhận xét của bạn: Đã làm việc cả trong ngành công nghiệp và trong học viện, tôi hơi quá khổ với "trong học viện, họ làm rất nhiều phép toán vô dụng trong thế giới thực". +1 cho cả nhận xét của bạn và câu trả lời của tdammer.
Giorgio

5

Đó là vì về cơ bản, lập trình máy tính là toán học. Các ngôn ngữ chức năng được thiết kế với ý tưởng này và đây là lý do tại sao phần lớn các hướng dẫn tập trung vào toán học.

Chỉ khó học nếu bạn không quen nghĩ về lập trình máy tính là có nền tảng toán học.


4
Về cơ bản tính toán là sự kết hợp giữa logic và số học. Đây không phải là toán học. Bạn không thể diễn đạt một hướng dẫn chi nhánh trong một công thức toán học - vì vậy nó không thể dựa trên toán học. Đám đông lập trình chức năng muốn nó dựa trên toán học để họ phát triển các ngôn ngữ chương trình hoạt động như thể các hướng dẫn chi nhánh không tồn tại.
James Anderson

9
@James Anderson, bạn đang nói rằng logic và số học không phải là toán học? Và tôi đã thấy hàng tấn công thức toán học có chứa các hướng dẫn chi nhánh (thường được thể hiện trong một hình thức giống như chuyển đổi).
Peter Taylor

4
Số học một tập hợp con của toán học liên quan đến phép tính đơn giản. Logic là một siêu toán học là nền tảng của mọi suy nghĩ hợp lý. Vô tình lập trình chức năng là một ý tưởng rất tốt để giải quyết các vấn đề có thể được diễn đạt bằng toán học; nó không quá nóng khi bạn đang cố tuân theo một mớ hỗn độn phi lý của các quy tắc tùy tiện như GAP (Thực hành kế toán được chấp nhận chung)
James Anderson

6
@ ian31, bạn định nghĩa từ " cơ bản " như thế nào? Bạn biết đấy, kỹ thuật dân dụng cũng dựa trên vật lý và toán học, trong khi thực tế tất cả chỉ là xây dựng công cụ cho mọi người sử dụng và thưởng thức. Và, bằng mọi cách, trước cả khi bắt đầu nghĩ về việc lập trình một giải pháp cho một số vấn đề trong thế giới thực, bạn phải dịch vấn đề đó thành một số hình thức toán học. Nó sẽ không hoạt động theo cách khác. Lập trình là tất cả về hình thức.
SK-logic

6
@ ian31, ngôn ngữ lập trình hình thức. Hành vi của họ được xác định nghiêm ngặt và có thể dự đoán. Do đó, mã hóa bất kỳ mô hình cụ thể nào (ngay cả khi nó mơ hồ) đang biến nó thành một hình thức chính thức. Toán học mở rộng tốt trên khu vực mơ hồ này, mặc dù nhận thức chung về nó bị giới hạn trong thế giới rõ ràng sáng sủa của các mô hình nghiêm ngặt được xác định rõ.
SK-logic

1

Tôi nghĩ rằng "The Little Schemer" là một giới thiệu tuyệt vời về lập trình chức năng và hoàn toàn không phải là toán học. Nó không vào được Monads, vì vậy nó có thể quá cơ bản đối với thị hiếu của bạn, nhưng lại làm xuất phát từ tổ hợp Y cho đến cuối cùng.

Gần đây tôi đã trải qua nó sau khi không thực hiện bất kỳ chương trình chức năng nào kể từ khi học đại học 12 năm trước, và đó là một sự bồi dưỡng tuyệt vời, tôi chắc chắn cảm thấy sẵn sàng để giải quyết những thứ cao cấp hơn sau khi thực hiện hầu hết các vấn đề trong cuốn sách bằng cách sử dụng vợt.

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.