F# “tail”

(Riporto questa discussione avvenuta la sera del 9 novembre 2010 sul forum dedicato a F#, nel portale di DotNetWork.it, poiché un problema al server l’ha purtroppo cancellata)

Arcopal:
Ciao e complimenti per il forum.
Ho trovato in giro la seguente funzione:

let rec length list = 
   match list with 
   | [] -> 0 
   | _ :: tail -> 1 + length tail

Volevo capire come si interpreta. Specialmente l’ultima riga dove c’è la parola “tail”.

Mia risposta:
Ciao Arcopal.
Partiamo dalla fine: la parola “tail” è in inglese e significa “coda” (così come “head” significa “testa”). Anzi, head e tail vengono utilizzati in particolare in algoritmi ricorsivi… Per esempio, proviamo a vedere questo codice che ho trovato in un libro su F#:

// concatenate a list of strings 
// into single string 
let rec conactStringList = 
   function head :: tail -> head + conactStringList tail 
      | [] -> ""// test data 
let jabber = 
   ["'Twas "; "brillig, "; "and ";
      "the "; "slithy "; "toves "; "..."] 
// call the function 
let completJabber = conactStringList jabber 
// print the result 
printfn "%s" completJabber

Dovrebbe (in teoria) essere abbastanza chiaro che “head” indica il primo elemento di una lista, mentre “tail” indica la coda, cioè tutto il resto. Separando le due parti, diventa semplice gestire una lista di stringhe (come nell’esempio) con una funzione ricorsiva (che nel codice F# è indicata con la parola riservata “rec”). Riprendendo il codice che hai pubblicato tu e inserendo la parte del codice che ti ho appena fatto vedere, possiamo scrivere qualcosa come questo codice:

let rec length list = 
   match list with 
      | [] -> 0 
      | _ :: tail -> 1 + length tail 
// test data 
let elenco = 
   ["'Twas "; "brillig, "; "and "; 
      "the "; "slithy "; "toves "; "..."] 
// call the function 
let l = length elenco

Se avvii il programmino in F# interactive (selezionando tutto il codice di cui sopra e avviandolo con la combinazione ALT+INVIO), otterrai il seguente risultato:

val length : 'a list -> int 
val elenco : string list = 
   ["'Twas "; "brillig, "; "and "; 
      "the "; "slithy "; "toves "; "..."] 
val l : int = 7

Pubblicato il 3 luglio 2015 su Novità. Aggiungi ai preferiti il collegamento . Lascia un commento.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: