Каждый раз, когда требуется другой символ (или уведомление о завершении), следующий символ - если таковой имеется - отображается в верхнем регистре, который сравнивается с буквой «W», если он получен неравным.
filter (/= 'W') . map toUpper $ "justaword"
~> filter (/= 'W') (toUpper 'j' : map toUpper "ustaword")
~> filter (/= 'W') ('J' : map toUpper "ustaword")
~> 'J' : filter (/= 'W') (map toUpper "ustaword")
Теперь доступен первый символ, поэтому для запросов, таких как null
или функций, таких как take 1
, дальнейшая работа не выполняется. Если потребителю потребуется больше символов, они будут создаваться один за другим, пока не будет достигнут конец строки.
Пример:
Prelude Data.Char> take 10 . filter (/= 'W') . map toUpper $ repeat 't'
"TTTTTTTTTT"
repeat
создает бесконечный список, но пока используется только конечная часть, вычисление заканчивается за конечное время. Однако take 10 . filter (/= 'W') . map toUpper $ repeat 'w'
не будет завершен, поскольку ни один из произведенных символов не проходит filter
, чтобы достичь take 10
.