Qual è la differenza tra le seguenti due formule?where clauses in list comprehensions
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
uscita Esempio: cp [[1,2,3],[4,5]] => [[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]
Secondo Pensando funzionalmente Haskell (Pag. 92), la seconda versione è "una definizione più efficiente ... [che] garantisce che cp xss è calcolata solo una volta ", anche se l'autore non spiega mai perché. Avrei pensato che fossero equivalenti
Correlato: http://stackoverflow.com/q/3951012/190376 –