Bạn hoàn toàn đúng: tính toán hàm trả về không có gì là vô nghĩa - nếu bạn đang nói về các hàm toán học. Nhưng giống như với nhiều khái niệm toán học, "chức năng" có nhiều ngôn ngữ lập trình chỉ liên quan đến các hàm toán học, nhưng hành xử nhiều hay ít khác nhau một cách tinh tế.
Tôi tin rằng bạn nên giải thích bằng ngôn ngữ không làm sai: một ngôn ngữ như vậy là Haskell. Đó là một ngôn ngữ thuần túy chức năng có nghĩa là hàm Haskell cũng là một hàm toán học. Thật vậy, bạn có thể viết các hàm Haskell nhiều hơn theo kiểu toán học, ví dụ:
my_tan(x) = sin(x)/cos(x) -- or (preferred): tan' x = sin x/cos x
hơn trong C++
double my_tan(double x) { return sin(x)/cos(x); }
Tuy nhiên, trong chương trình máy tính bạn không chỉ muốn tính toán chức năng, phải không? Bạn cũng muốn hoàn thành công việc, như hiển thị nội dung trên màn hình, gửi dữ liệu qua mạng, đọc giá trị từ cảm biến, v.v. Trong Haskell, những thứ như thế này được tách biệt hoàn toàn với chức năng thuần túy, tất cả đều hoạt động trong cái gọi là IO
đơn nguyên. Ví dụ, hàm putStrLn
, in một dòng ký tự, có loại String -> IO()
.Ý nghĩa, phải mất một đối số String
và trả về hành động IO
in ra chuỗi đó khi được gọi từ hàm main
và không có gì khác (số ()
parens gần bằng void
trong C++). Cách làm IO này có nhiều lợi ích, nhưng hầu hết các ngôn ngữ lập trình đều cẩu thả: chúng cho phép tất cả các chức năng để làm IO, và cũng để thay đổi trạng thái bên trong của chương trình của bạn. Vì vậy, trong C++, bạn có thể chỉ cần có một hàm void putStrLn(std::string)
, mà còn "trả về" một hành động IO in chuỗi và không có gì khác, nhưng không rõ ràng cho bạn biết như vậy. Lợi ích là bạn không cần phải buộc nhiều nút thắt trong não của bạn khi suy nghĩ về những gì các đơn nguyên IO thực sự là (nó khá vòng xoay). Ngoài ra, nhiều thuật toán có thể được triển khai để chạy nhanh hơn nếu bạn có khả năng thực sự nói với máy "thực hiện chuỗi các quy trình này ngay bây giờ!" thay vì chỉ yêu cầu kết quả của một số tính toán trong đơn nguyên IO.
Có rất nhiều thứ để thực hiện chức năng, ngoài việc trả lại thứ gì đó ... –
Bạn đang bỏ lỡ khái niệm về [_side effects_] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science)). – ildjarn
Chức năng đó không làm gì cả, và rất có thể sẽ bị xóa khi biên dịch –