Là lập trình chức năng liên quan mạnh mẽ đến toán học?


20

Là lập trình chức năng có liên quan đến toán học vì phần lớn lập trình chức năng được mô tả với các khái niệm toán học? Đây có phải là một cơ sở toán học vững chắc để học và hiểu lập trình chức năng cho một lập trình viên với một nền tảng bắt buộc không?


1
Là câu hỏi này được gắn thẻ chính xác với mathicala hay nó nên là toán học?

Đâyđây là hai câu hỏi rất giống nhau. Tôi không nghĩ rằng bạn phải có một 'cơ sở vững chắc' trong toán học nhưng bạn cần hiểu khá rõ về các nguyên tắc của nó theo quan điểm nào đó. Hình học giúp tôi nhiều nhất với bản đồ bộ nhớ, nhưng tôi hiếm khi nghĩ về những con số như vậy nữa. Toán học là (có thể) RẤT hữu ích mặc dù.
Garet Claborn

Câu trả lời:


27

Tất cả các chương trình có liên quan đến toán học. Thật vậy, nhiều trường đại học vẫn đặt các chương trình khoa học máy tính của họ dưới sự xem xét của khoa toán.

Đối với việc học lập trình chức năng, bạn không cần phải có một nền tảng vững chắc về toán học để học nó. Bây giờ tôi đã học ba ngôn ngữ chức năng khác nhau để thành thạo hợp lý (Haskell, Erlang, Clojure) và kỹ năng toán học của riêng tôi là vô cùng yếu. Thực tế, cộng đồng của Haskell có thể hơi khó chịu trong cách nói về các vấn đề tập trung vào toán học, nhưng cả Erlang và Clojure đều là những ngôn ngữ lập trình chức năng rất thực dụng, không khó để nhận vì thông tin hướng dẫn được viết, dường như, cho các lập trình viên, không phải những người đam mê toán học khó tính. Điều đó đã được nói, mặc dù tôi không biết gì về toán học, tôi đã chọn Haskell, vì vậy điều đó không phải là không thể.

Khó khăn thực sự mà tôi đã tìm thấy trong việc chọn các ngôn ngữ lập trình khai báo nói chung (trong đó chức năng là một tập hợp con) đang từ bỏ sự thôi thúc muốn kiểm soát; để nói với máy tính phải làm gì. Phải mất một số làm quen.


Lời hay ý, +1.
Mudassir

4
Khi bạn học SQL, lập trình khai báo tốt không quá khó.

7

Vâng. Về cơ bản, một chương trình chức năng là một loạt các câu lệnh như thế:

// 1_ và 2_ là "đối số giả" f (1_): = sin (1_) g (1_, 2_): = 1_ + 2_ v.v ...

x = f ()

y = g (x)

z = h (x, h2 (y))

v.v ...

Bạn đang viết những gì chương trình phải làm dưới dạng phương trình xác định các giá trị mới (lưu ý: không phải biến) là các hàm của các giá trị được xác định trước đó. Bạn cũng xác định các chức năng là quan hệ. Nó thực sự khá giống với cách viết các định lý toán học.


Tôi có thể hiểu các chức năng toán học tốt hơn so với synatx kỳ lạ của haskell và những người khác. Bạn có bất kỳ liên kết liên quan đến các bước toán học với cú pháp của bất kỳ ngôn ngữ chức năng.
RainDoctor

Câu trả lời này là chính xác. FP sẽ bắt đầu có ý nghĩa hoàn hảo khi bạn nhận ra (và nội tâm hóa) rằng bạn đang viết các hàm toán học chứ không phải các thủ tục từng bước. Hầu hết mọi người học lập trình thủ tục trước tiên và hành lý đó rất lớn. Tôi nghĩ "chức năng" trong ngôn ngữ thủ tục nên được gọi là "thủ tục".
Kakaji

2

IMO Mathematica, như một ví dụ về ngôn ngữ mà bạn có thể sử dụng lập trình chức năng, không yêu cầu nền tảng vững chắc về toán học. Trong thực tế, tôi không nghĩ rằng tôi đã gặp phải bất cứ điều gì như lập trình chức năng trong quá trình giáo dục toán học cơ bản của tôi. Tôi bắt đầu lập trình Mathicala theo kiểu C và phát hiện ra lập trình chức năng chỉ vài năm sau đó. Tôi không nghĩ rằng các cấu trúc lập trình chức năng cơ bản như Map, Apply, NestList, vv đòi hỏi bất kỳ nền toán học ở tất cả.


1

không thực sự lập trình chức năng chỉ là một phương pháp, nhưng nó có cơ sở trong tính toán lambda và những thứ tương tự.

Đóng cửa là một nỗ lực (nhỏ) để giới thiệu các khái niệm lập trình chức năng vào các ngôn ngữ thủ tục. thay vì, thay vào đó for(int i =0 ; i < num; i++) doStuff(arr[i]);, bạn có thể giả sử rằng các phần tử của mảng vốn có thể có "công cụ được thực hiện cho chúng" vì vậyarr.each do |el| doStuff(el) end


10
Bạn chỉ làm gương cho một chức năng ẩn danh, không phải là đóng cửa. Wikiedpia:The term closure is often mistakenly used to mean anonymous function. This is probably because most languages implementing anonymous functions allow them to form closures and programmers are usually introduced to both concepts at the same time. These are, however, distinct concepts. A closure retains a reference to the environment at the time it was created (for example, to the current value of a local variable in the enclosing scope) while a generic anonymous function need not do this.

1

Câu trả lời ngắn gọn là: Có, bởi vì mọi thứ với một mức độ chính thức hóa nhất định (như ngôn ngữ lập trình) đều liên quan mật thiết đến toán học, với các mức độ khác nhau của toán học.

Nhưng, sử dụng một ngôn ngữ lập trình không hoàn toàn đòi hỏi phải làm quen với toán học, ví dụ như nền tảng ngôn ngữ học. Bạn không cần phải biết ngôn ngữ tự do ngữ cảnh là gì và luật và tài sản mà ngôn ngữ đó có để sử dụng ngôn ngữ đó. Tương tự như vậy, bạn không cần phải là người Đức hay người La Mã để nói tiếng Đức hoặc tiếng Pháp.

Ký hiệu "toán học" không phải là một thuộc tính chung của các ngôn ngữ chức năng. Scala và tất cả các ngôn ngữ dựa trên Lisp có cú pháp rất khác so với Haskell.

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.