# sottoinsiemi di cardinalita' n: # osservare che funziona sotto la precondizione n<=lenght l!!! # vedere warning! - fun subsets 0 l = [[]] | subsets n l = if (n = (length l)) then [l] else let val (h::t) = l in let val p1 = subsets (n-1) t and p2 = (subsets n t) in append (map (insert h) p1) p2 end end; ! Toplevel input: ! else let val (h::t) = l ! ^^^^^^ ! Warning: pattern matching is not exhaustive > val 'a subsets = fn : int -> 'a list -> 'a list list - subsets 2 l; > val it = [[1, 2], [1, 3], [2, 3]] : int list list # trasposta di una matrice # aggiungi prende una lista e aggiunge elemento per elemento in testa # ad ogni lista di una lista di liste... - fun aggiungi nil m = m | aggiungi (hd::tl) (h::t) = (hd::h)::(aggiungi tl t); ! Toplevel input: ! ....aggiungi nil m = m ! | aggiungi (hd::tl) (h::t) = (hd::h)::(aggiungi tl t). ! Warning: pattern matching is not exhaustive > val 'a aggiungi = fn : 'a list -> 'a list list -> 'a list list - aggiungi [1,2,3] [[],[],[]]; > val it = [[1], [2], [3]] : int list list # ma anche senza accoppiare gli argomenti: - fun aggiungiC l m = applicaLista (map (fn x=> fn y=> x::y) l) m; > val 'a aggiungi = fn : 'a list -> 'a list list -> 'a list list - fun trasposta nil = nil | trasposta [x] = map (fn y=>[y]) x | trasposta (hd::tl) = aggiungi hd (trasposta tl); > val 'a trasposta = fn : 'a list list -> 'a list list