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

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

myPrint !str = putStrLn str

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

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

2 ответа

Решение

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

Это известно как deepseq,

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

seqList :: [a] -> ()
seqList [] = ()
seqList (x:xs) = strictList xs
Другие вопросы по тегам