Dưới đây là một chức năng đơn giản để tính số Fibonacci:Tại sao thêm hiệu suất phân loại chữ ký đa hình?
fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)
Trong ghci tôi có thể tính toán hàng loạt một cách nhanh chóng. Trong thực tế, một chút thử nghiệm cho thấy rằng tính toán chạy trong khoảng thời gian tuyến tính.
ghci> last $ take 100000 fib
354224848179261915075 -- takes under a second
Nếu tôi thay đổi chữ ký loại là đa hình thay vì:
fib :: Num a => [a]
fib = 1 : 1 : zipWith (+) fib (tail fib)
Sau đó, các thuật toán trở nên chậm hơn. Trong thực tế, có vẻ như nó bây giờ chạy trong thời gian mũ!
Việc chuyển sang chữ ký kiểu đa hình có nghĩa là danh sách đang được tính toán lại hoàn toàn ở từng giai đoạn không? Nếu vậy, tại sao?
có thể trùng lặp của [Giá trị có loại có ràng buộc lớp thực sự là một hàm tại thời gian chạy không?] (Http://stackoverflow.com/questions/7659845/will-a-value-that-has-a -giới hạn-với-lớp-thực-là-một-chức-năng-ru) –