Если я понимаю, обсуждение здесь правильно, seq
не следует оценивать значение в два раза, а в x 'seq' x
должны быть оценивая x
раз.
Тогда почему у меня такое поведение?
λ> :set +s
λ> let fib x = if x <= 1 then x else fib (x - 1) + fib (x - 2)
(0.01 secs, 102,600 bytes)
λ> fib 30
832040
(2.49 secs, 638,088,448 bytes)
λ> let x = fib 30 in x
832040
(2.47 secs, 638,088,792 bytes)
λ> let x = fib 30 in x 'seq' x
832040
(4.95 secs, 1,276,067,128 bytes)
что, очевидно, двойная оценка? Я что-то не понимаю?
EDIT: как я спросил @danidiaz ниже, я также оценил
λ> (\x -> x 'seq' x) (fib 30)
832040
(2.51 secs, 638,087,888 bytes)
λ> let x = (fib 30) :: Int in x 'seq' x
832040
(2.52 secs, 732,476,640 bytes)
которые еще более удивительны.
EDIT 2: Я вижу, что этот вопрос был отмечен как дубликат более раннего вопроса, который задает вопрос об ограничении мономорфизма. Когда я столкнулся с этой проблемой, я понятия не имел, что это связано с ограничением. Поэтому, если кто-то найдет меня в моем положении, я думаю, что ответ на этот вопрос будет полезен.