Tôi tự hỏi tại sao hàm được mong đợi bằng dấu ngoặc kép lại có chữ ký loại a -> b -> a
thay vì b -> a -> a
. Có quyết định thiết kế nào đằng sau điều này không?Tại sao gấp trái mong đợi (a -> b -> a) thay vì (b -> a -> a)?
Trong Haskell, ví dụ, tôi phải viết foldl (\xs x -> x:xs) [] xs
để đảo ngược danh sách thay vì ngắn hơn foldl (:) [] xs
(có thể với b -> a -> a
). Mặt khác, có những trường hợp sử dụng yêu cầu tiêu chuẩn a -> b -> a
. Trong Scala, điều này có thể được thêm vào: xs.foldLeft(List.empty[Int]) ((xs, x) => xs:+x)
có thể được viết là xs.foldLeft(List.empty[Int]) (_:+_)
.
Các trường hợp sử dụng tương ứng xảy ra đòi hỏi chữ ký loại nhất định thay vì chữ ký thay thế, hoặc có quyết định nào khác dẫn đến thiết kế gấp trái trong Haskell và Scala (và có thể là nhiều ngôn ngữ khác)?
Nói cách khác, bạn phải đảo ngược thứ tự đối số của '(:)' để đảo ngược danh sách. Có nghĩa với tôi. –
Lưu ý rằng 'mapAccumL' và' mapAccumR' (từ 'Data.List' /' Data.Traversable') có cùng chữ ký, mặc dù chúng cũng hoạt động theo hướng ngược lại. – leftaroundabout