import Data.List
a = foldl' (+) 0 [1..99999999]
main = putStrLn $ show $ a
Chương trình này mất một lúc để chạy. Nhưng a
không phụ thuộc vào bất cứ điều gì và do đó là không đổi. Nó có thể được tính toán hoàn hảo tại thời gian biên dịch. Tại sao GHC không tối ưu hóa điều này? Có một lá cờ cho nó để làm như vậy, hay tôi nên chỉ thay thế loại tính toán liên tục đó bằng chính các giá trị đó?Tại sao GHC không tối ưu hóa cho các hằng số?
'a' không thực sự khá liên tục vì nó đa hình. GHC loại trừ kiểu như '(Num a, Enum a) => a', mà nội bộ dịch sang một hàm đòi hỏi các đối số từ điển lớp. (Tuy nhiên ngay cả khi bạn làm cho nó 'a :: Int', giá trị sẽ chỉ được tính khi chạy.) – leftaroundabout
Những gì bạn đang nói về được gọi là siêu biên và nó không hoàn toàn dễ dàng như bạn làm cho nó có vẻ. Đó là một chủ đề nghiên cứu và tôi tin rằng một số người đang thử nghiệm điều này với Haskell, nhưng không có nơi nào gần sản xuất đã sẵn sàng. Bạn có thể nhận được nó với một số mẫu Haskell hackery, nhưng nó thường không được khuyến khích. – kqr