Tôi vừa hoàn thành việc học hỏi bạn vào một ngày khác, và tôi đang cố gắng hiểu ý nghĩa của Hạn chế đơn hình, như được mô tả bởi Haskell Wiki . Tôi nghĩ rằng tôi hiểu làm thế nào MR có thể ngăn chặn các đánh giá lặp đi lặp lại, nhưng tôi không biết tại sao những đánh giá lặp đi lặp lại đó không thể tránh được bằng các phương tiện đơn giản hơn nhiều.
Ví dụ cụ thể mà tôi có trong đầu là ví dụ được sử dụng bởi wiki:
f xs = (len,len)
where
len = genericLength xs
nơi genericLength
có loại Num a => [b] -> a
.
Rõ ràng, genericLength xs
chỉ cần được tính toán một lần để đánh giá (len,len)
, vì đó là cùng một hàm với cùng các đối số. Và chúng ta không cần phải thấy bất kỳ lời mời nào f
để biết điều đó. Vậy tại sao Haskell không thể thực hiện tối ưu hóa này mà không đưa ra quy tắc như MR?
Cuộc thảo luận trên trang wiki đó cho tôi biết nó có liên quan đến thực tế Num
là một kiểu chữ chứ không phải là một kiểu cụ thể, nhưng ngay cả như vậy, không nên rõ ràng vào thời gian biên dịch rằng một hàm thuần sẽ trả về cùng một giá trị- -Và do đó, cùng một loại Num cụ thể - khi được đưa ra cùng một đối số hai lần?
f [] :: (Int, Float)
. Bây giờ nó làm cho ý nghĩa hoàn hảo. Cảm ơn bạn.