Lợi ích hiệu suất của việc sử dụng ~ (kết hợp mẫu lười) trong phân vùng Data.List là gì. Ví dụ về sự phù hợp với mô hình lười biếng gợi ý rằng nó rất hữu ích khi các giá trị bên trong hàm tạo tuple không bao giờ được sử dụng (f (x, y) = 1). Trong phân vùng (chọn, bên dưới), danh sách ts, fs luôn được sử dụng (nếu vị từ p được áp dụng cho x là True, hay không). Tôi chắc chắn đây là một quyết định rất tốt để sử dụng ~, nhưng điểm là gì? Tại sao không phù hợp với mô hình nghiêm ngặt?Đối sánh mẫu phù hợp trong dữ liệu.LIST
partition :: (a -> Bool) -> [a] -> ([a],[a])
{-# INLINE partition #-}
partition p xs = foldr (select p) ([],[]) xs
select :: (a -> Bool) -> a -> ([a], [a]) -> ([a], [a])
select p x ~(ts,fs) | p x = (x:ts,fs)
| otherwise = (ts, x:fs)
(Lưu ý: Tôi đã nhìn here nó không trả lời câu hỏi ở trên!)
cf. http://en.wikipedia.org/wiki/Tail_call#Tail_recursion_modulo_cons –