В чем разница между следующими двумя формулами?
cp [] = [[]]
cp (xs:xss) = [x:ys | x <- xs, ys <- cp xss]
----------------------------------------------
cp [] = [[]]
cp (xs:xss) = [x:ys | x <- xs, ys <- yss]
where yss = cp xss
Пример вывода: cp [[1,2,3],[4,5]] => [[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]
В соответствии с мышлением функционально с Haskell (стр. 92) вторая версия является "более эффективным определением... [который] гарантирует, что cp xss вычисляется только один раз", хотя автор никогда не объясняет, почему. Я бы подумал, что они эквивалентны.