Подтвердить что ты не робот

Принудительная строгость для списков в haskell

Я сделал очень трудоемкий алгоритм, в результате которого получается короткая строка. Когда я пытаюсь распечатать его (через putStrLn), он появляется на экране символом по символу. Я понял, почему это произошло, и я попытался принудительно оценить строку перед фактической печатью.

myPrint !str = putStrLn str

Но эта помощь очень мало. Когда я запускал программу в отладке, я заметил, что принудительная оценка! Str только для первого символа.

Кто-нибудь знает, почему это так, и как с этим бороться?

4b9b3361

Ответ 1

(!) преобразуется в seq, который строго соответствует Нормальной форме слабых головок - то есть он оценивает только внешний конструктор. Чтобы более глубоко оценить, вам нужна "глубокая" форма seq.

Это называется deepseq.

Он находится в пакете deepseq.

Ответ 2

seqList :: [a] -> ()
seqList [] = ()
seqList (x:xs) = strictList xs