У меня есть небольшая альтернативная реализация 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
. Вызывают ли совпадения шаблонов такое поведение?
Поскольку я только что прочитал эти статьи, возможно, из-за отсутствия опыта я не могу применить то, что я там прочитал, к моему примеру кода. Итак, как можно изменить эту конкретную реализацию, чтобы вести себя более лениво?