1) Tốt theo tiêu chuẩn nào? Bạn mong muốn những đặc tính nào?
Liệt kê sắp xếp? Dễ dàng.Hãy làm Quicksort trong Haskell:
sort [] = []
sort (x:xs) = sort (filter (< x) xs) ++ [x] ++ sort (filter (>= x) xs)
Mã này có lợi thế là cực kỳ dễ hiểu. Nếu danh sách trống, nó được sắp xếp. Nếu không, hãy gọi phần tử đầu tiên x, tìm các phần tử nhỏ hơn x và sắp xếp chúng, tìm các phần tử lớn hơn x và sắp xếp các phần tử đó. Sau đó, nối các danh sách được sắp xếp với x ở giữa. Hãy thử làm cho cái nhìn đó dễ hiểu trong C++.
Tất nhiên, Mergesort nhanh hơn nhiều để sắp xếp danh sách được liên kết, nhưng mã cũng dài hơn 6 lần.
2) Rất dễ thực hiện phong cách bắt buộc trong khi vẫn hoạt động hoàn toàn. Bản chất của phong cách bắt buộc là sắp xếp các hành động. Các hành động được sắp xếp theo trình tự trong một thiết lập thuần túy bằng cách sử dụng các monads. Bản chất của monads là chức năng ràng buộc:
(Monad m) => (>>=) :: m a -> (a -> m b) -> m b
Chức năng này tồn tại trong C++ và được gọi là ;
.
Một chuỗi các hành động trong Haskell, ví dụ, được viết thusly:
putStrLn "What's your name?" >>=
const (getLine >>= \name -> putStrLn ("Hello, " ++ name))
Một số đường cú pháp có sẵn để làm cho cái nhìn này bắt buộc hơn (nhưng lưu ý rằng đây là chính xác cùng một mã):
do {
putStrLn "What's your name?";
name <- getLine;
putStrLn ("Hello, " ++ name);
}
Bạn đang hỏi khó khăn như thế nào để mô phỏng một phong cách khi viết bằng một kiểu khác? – ShreevatsaR
Giả định rằng một ngôn ngữ chức năng sẽ được thực hiện bằng cách sử dụng một mệnh lệnh là nghi ngờ. OCaml được viết bằng OCaml và triển khai phổ biến nhất của Haskell (GHC) được viết bằng Haskell. – Chuck
@ShreevatsaR: Có lẽ tôi nên nói lại, nhưng đó là những gì tôi yêu cầu. Làm thế nào khó khăn để viết chương trình bắt buộc trong khi mã hóa trong ngôn ngữ chức năng thuần túy mà không cần cấu trúc đặc biệt như 'progn', 'do' ... Ví dụ, Đó là một mẹo được biết đến mà các chương trình chức năng có thể mô phỏng trạng thái 'bắt buộc' với việc sử dụng các bao đóng. Đó là những gì tôi đã hỏi về. – Bubba88