Функция, использующая foldr, слишком активна

У меня есть небольшая альтернативная реализация groupBy , которая мне более полезна, чем версия в Data.List , потому что она не требует, чтобы тест был отношением эквивалентности:

groupBy' :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy' f = foldr step []
    where step x [] = [[x]]
          step x (xs:xss)
              | x `f` head xs = (x:xs):xss
              | otherwise     = [x]:xs:xss

Однако он слишком нетерпелив и не запускает вычисления для таких входов, как groupBy '(. Я прочитал статьи HaskellWiki и Wikibooks , в которых объясняется, почему некоторые вещи, такие как сопоставление шаблонов, могут сделать функции менее ленивыми, и я думаю, что понимаю больше всего примеров, приведенных там. Тем не менее, я не понимаю, почему эта функция не может начать выводить данные, пока не достигнет undefined . Вызывают ли совпадения шаблонов такое поведение?

Поскольку я только что прочитал эти статьи, возможно, из-за отсутствия опыта я не могу применить то, что я там прочитал, к моему примеру кода. Итак, как можно изменить эту конкретную реализацию, чтобы вести себя более лениво?

10
задан danlei 7 November 2011 в 03:01
поделиться