В общем,
foldr g [[]] [] = [[]]
foldr g [[]] [a,b,c, ...] = g a (foldr g [[]] [b,c, ...])
Ваша функция g
равна ( \ x y -> [] : map (x:) y )
т.е.
g x y = [] : map (x:) y
Таким образом, с вашим g
мы имеем
foldr g [[]] [a,b,c, ...] = [] : map (a:) (foldr g [[]] [b,c, ...])
Заменив foldr g [[]]
просто foo
, а псевдокод [a,b,c, ...]
действительным шаблоном (a:bc)
, мы получим
foo [] = [[]]
foo (a:bc) = [] : map (a:) (foo bc )
, который является «обычной функцией» без лямбды и без where
пункт.