Đây là những ví dụ mà thuyết phục tôi để tìm hiểu Haskell (và cậu bé là tôi vui vì tôi đã làm).
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
OK, đây là một chương trình ngắn, dễ đọc. Theo nghĩa đó, nó tốt hơn một chương trình C. Nhưng điều này rất khác với (giả sử) một chương trình Python có cấu trúc rất giống nhau như thế nào?
Câu trả lời là lười đánh giá. Trong hầu hết các ngôn ngữ (thậm chí một số ngôn ngữ chức năng), một chương trình có cấu trúc như chương trình ở trên sẽ dẫn đến việc toàn bộ tệp được tải vào bộ nhớ, và sau đó được viết lại dưới một tên mới.
Haskell là "lười biếng". Nó không tính toán mọi thứ cho đến khi nó cần và mở rộng không tính toán những thứ nó không bao giờ cần. Ví dụ, nếu bạn xóa writeFile
dòng, Haskell sẽ không bận tâm đọc bất cứ thứ gì từ tệp ngay từ đầu.
Như vậy, Haskell nhận ra rằng writeFile
phụ thuộc vào readFile
, và do đó có thể tối ưu hóa đường dẫn dữ liệu này.
Mặc dù kết quả phụ thuộc vào trình biên dịch, nhưng điều thường xảy ra khi bạn chạy chương trình trên là điều này: chương trình đọc một khối (ví dụ 8KB) của tệp đầu tiên, sau đó ghi nó vào tệp thứ hai, sau đó đọc một khối khác từ tệp đầu tiên và ghi nó vào tệp thứ hai, v.v. (Hãy thử chạy strace
trên nó!)
... trông rất giống những gì việc triển khai C hiệu quả của một bản sao tệp sẽ làm.
Vì vậy, Haskell cho phép bạn viết các chương trình nhỏ gọn, có thể đọc được - thường mà không làm giảm nhiều hiệu suất.
Một điều nữa tôi phải nói thêm là Haskell chỉ đơn giản là gây khó khăn cho việc viết các chương trình lỗi. Hệ thống loại tuyệt vời, thiếu tác dụng phụ và tất nhiên là tính nhỏ gọn của mã Haskell giúp giảm lỗi vì ít nhất ba lý do:
Thiết kế chương trình tốt hơn. Độ phức tạp giảm dẫn đến ít lỗi logic hơn.
Mã nhỏ gọn. Ít dòng hơn cho lỗi tồn tại trên.
Biên dịch lỗi. Rất nhiều lỗi chỉ là Haskell không hợp lệ .
Haskell không dành cho tất cả mọi người. Nhưng mọi người nên thử.