2015-11-16 16 views

risposta

17

liste formano un monoid struttura, con associativa un'operazione binaria ++ e elemento neutro []. Cioè, abbiamo

[] ++ xs = xs = xs ++ [] (xs ++ ys) ++ zs = xs ++ (ys ++ zs) 

Nel frattempo, i numeri hanno un sacco di struttura monoid, ma il relativo uno qui è che in cui l'operazione è * e l'elemento neutro è 1.

1 * x = x = x * 1   (x * y) * z = x * (y * z) 

La funzione product è non solo una mappa elenchi di numeri ai numeri: è un homomorphism monoid, riflettendo la struttura lista monoid nel monoid numerica. Fondamentalmente,

product (xs ++ ys) = product xs * product ys 

e

product [] = 1 

Infatti, per ottenere il primo, abbiamo praticamente abbiamo quest'ultimo costretto su di noi.

2

prodotto è una piega con valore iniziale di 1 in modo che quando piegando un elenco vuoto solo restituisce il valore di inizializzazione, arteria 1.

Un esempio di implementazione del prodotto a ilustrate esso:

product :: [Int] -> Int 
product lst = foldr (\x y -> x*y) 1 lst 

Dai uno sguardo a fold per capire bene.

7

è una cosa matematica - di solito si definisce una somma vuota di essere 0 e un prodotto vuoto da 1 perché questo si adatta alle vostre leggi soliti ben

ad esempio in questo modo si può giustificare la definizione induttiva di un prodotto - see Wikipedia

7

Perché questa è l'identità nella categoria della moltiplicazione.

Per essere più pratico:

product [1,2,3] == product [1] * product 2:3:[] 
       == product [1] * product [2] * product 3:[] 
       == product [1] * product [2] * product [3] * product [] 

Che a sua volta consente di implementare con un semplice ricorsione:

product [] = 1 
product (x:xs) = x * product xs 
+2

@developerbmw troverai che indossare il tuo cappello di matematica in Haskell è spesso vantaggioso. –

Problemi correlati