Esercizi di SML

Standard ML of New Jersey, Version 110.0.3 (unix)
NOTA: 't  e' un tipo di variabile non definito.

1) data una lista di interi definire una funzione che calcoli la somma degli interi pari (funzione arieta' 1 - somma ricorsiva) fun par ([]) = 0 | par (h::l) = if (h mod 2) = 0 then h + par([l]) else par([l]); 2) come prima con una funzione di arieta' 2 fun par (a,b) = if null(a) then b else if (hd(a) mod 2) = 0 then par(tl(a), hd(a) + b) else par(tl(a),b); PROVA: val par = fn : int list * int -> int - par([1,2,3,4,5],0); val it = 6 : int 3) definire un tipo lista di liste di interi e calcolare la lista delle somme dei valori delle liste type ll = int list list; fun sum ([]) = 0 | sum (h::l) = h + sum(l); fun sumll ([]) = [] | sumll (h::l)=sum(h)::sumll(l); PROVA: - sumll([[1,2,3],[1,2],[9]]); val it = [6,3,9] : int list 3b) sapreste definire una funzione di ordine superiore in SML per fare cio'? map sum [[1,2],[2]]; val it = [3,2] : int list definire in SML un tipo lista di coppie tali che la prima componente di ogni coppia sia un booleano e la seconda componente un intero. type boolint = bool*int list; Definire una funzione SML tale che, data una lista del tipo precedente, calcoli sia la somma dei valori interi nelle coppie con prima componente true che la somma dei valori interi nelle coppie con prima componente false type boolint2 = bool * int; fun sumtf ([],_) = 0 | sumtf ((h:boolint2)::t, true) = if ((#1)h = true) then (#2)h + sumtf (t,true) else sumtf (t,true) | sumtf ((h:boolint2)::t, false) = if ((#1)h = false) then (#2)h + sumtf (t,false) else sumtf (t,false); PROVA: sumtf ([(true,2),(true,7),(false,1)],true); val it = 9 : int sumtf ([(true,2),(true,7),(false,1)],false); val it = 1 : int Semplice funzione che testa se un albero ternario e' foglia oppure no. datatype ttree = foglia | node of ttree*ttree*ttree; fun tfoglia(foglia) = true = | tfoglia (node(_,_,_)) = false; val tfoglia = fn : ttree -> bool tfoglia (node ((node(foglia,foglia,foglia), foglia, foglia))); val it = false : bool

Definire in SML un tipo di albero ternario con nodi etichettati sugli interi. Definire una funzione SML tale che, dato un albero del tipo precedente, calcoli la somma dei valori sulla frontiera e determini se tale somma e' superiore al valore intero che etichetta la radice. datatype Ttree = vuoto | node of int * Ttree * Ttree * Ttree; fun summa (a,vuoto,vuoto, vuoto) = (a, true) | summa (a,node(b),node(c), node(d)) = if (a < (((#1)(summa(b))) + ((#1)(summa(c))) + ((#1)(summa(d))))) then (((#1)(summa(b))) + ((#1)(summa(c))) + ((#1)(summa(d))),true) else (((#1)(summa(b))) + ((#1)(summa(c))) + ((#1)(summa(d))),false); val summa = fn : int * Ttree * Ttree * Ttree-> int * bool - summa (1,node(3,vuoto,vuoto,vuoto), node(4,vuoto,vuoto,vuoto), vuoto); val it = (7,true) : int * bool - summa (8,node(3,vuoto,vuoto,vuoto), node(4,vuoto,vuoto,vuoto), vuoto); val it = (7,false) : int * bool Definire in SML un tipo di albero ternario con nodi etichettati sugli interi. Definire una funzione SML tale che, dato un albero del tipo precedente, calcoli il massimo dei valori sui nodi interni. UNDER CONSTRUCTION datatype Ttree = vuoto | node of int * Ttree * Ttree; fun maxNode(a, vuoto, vuoto) = a | maxNode(a, node(b), node(c))= if ((a > ((#1)(maxNode(node(b)))) andalso (a > ((#1)(node(c))))) then a elsif ((#1)(maxNode(node(b))) > (#1)(maxNode(node(c)))) then (maxNode(node(b))) else (maxNode(node(c)));





S, SML TASTIERA
Il motore di ricerca del Dizionario Informaticov1.03

Solo connessi ad Internet potete utilizzare DizSearch

Termini mancanti/suggerimenti ?

© Copyright 1997-2001 by Francesco Longo, flongo@dsi.unive.it

Homepage Dizionario Informatico