У меня есть небольшая альтернативная реализация 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' (<) [1,2,3,2,3,4,1,undefined]
. Я прочитал HaskellWiki и Wikibooks статьи которые объясняют, почему некоторые вещи, такие как совпадения с образцами, могут сделать функции менее ленивыми, и я думаю, что понимаю большинство приведенных здесь примеров. Тем не менее, я не понимаю, почему эта функция не может начать производить вывод до тех пор, пока он не достигнет значения undefined
. Соответствуют ли шаблону такое поведение?
Поскольку я только что прочитал эти статьи, возможно, это недостаток опыта, который заставляет меня не применять то, что я прочитал там, к моему примеру. Итак, как можно изменить эту конкретную реализацию, чтобы вести себя лениво?