Принудительная строгость для списков в haskell
Я сделал очень трудоемкий алгоритм, в результате которого получается короткая строка. Когда я пытаюсь распечатать его (через putStrLn), он появляется на экране символом по символу. Я понял, почему это произошло, и я попытался принудительно оценить строку перед фактической печатью.
myPrint !str = putStrLn str
Но эта помощь очень мало. Когда я запускал программу в отладке, я заметил, что принудительная оценка! Str только для первого символа.
Кто-нибудь знает, почему это так, и как с этим бороться?
Ответы
Ответ 1
(!)
преобразуется в seq
, который строго соответствует Нормальной форме слабых головок - то есть он оценивает только внешний конструктор. Чтобы более глубоко оценить, вам нужна "глубокая" форма seq
.
Это называется deepseq
.
Он находится в пакете deepseq.
Ответ 2
seqList :: [a] -> ()
seqList [] = ()
seqList (x:xs) = strictList xs