Принудительная строгость для списков в haskell - PullRequest
11 голосов
/ 06 апреля 2011

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

myPrint !str = putStrLn str

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

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

Ответы [ 2 ]

16 голосов
/ 06 апреля 2011

(!) переводится в seq, что строго соответствует Слабая голова Нормальная форма - то есть, она вычисляется только для самого внешнего конструктора. Чтобы оценить глубже, вам нужна «глубокая» форма seq.

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

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

2 голосов
/ 06 апреля 2011
seqList :: [a] -> ()
seqList [] = ()
seqList (x:xs) = strictList xs
...