Perché la funzione product
in Haskell restituisce 1
se viene fornito un elenco vuoto?Perché il prodotto [] restituisce 1?
risposta
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.
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.
è 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
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
- 1. Perché (true && 1) restituisce 1, ma (1 && true) restituisce true?
- 2. Perché IndexOf restituisce -1?
- 3. Perché ISNUMERIC ('.') Restituisce 1?
- 4. perché cout.tellp restituisce sempre -1?
- 5. Perché Math.round (0.49999999999999994) restituisce 1?
- 6. Perché "n & 1 == 0" restituisce sempre false?
- 7. Perché [NSObject respondsToSelector: @selector (init)] restituisce 1?
- 8. Perché l'espressione regolare restituisce sempre 1?
- 9. Perché non pow (sqrt (-1), 2) restituisce -1?
- 10. Perché Java BigDecimal restituisce 1E + 1?
- 11. rename() restituisce -1. Come sapere perché il rename fallisce?
- 12. C#: ExecuteNonQuery() restituisce -1
- 13. android view.getId() restituisce -1
- 14. URLConnection.getContentLength() restituisce -1
- 15. getLastVisiblePosition restituisce -1
- 16. Android Location.getAccuracy() restituisce 1
- 17. Perché l'elenco la mia mappa Perl restituisce solo 1?
- 18. Perché "www" .count ("ww") restituisce 1 e non 2?
- 19. Perché SELECT 2^3 restituisce 1 in SQL Server?
- 20. Perché "[:: - 1]" restituisce una lista inversa in Python?
- 21. perché parse_url restituisce il frammento?
- 22. Perché ~ 0 è -1?
- 23. ABAddressBookGetPersonCount restituisce -1 in iOS
- 24. (-1 >> 1) == -1 - Perché?
- 25. cellForRowAtIndexPath non chiamato; sezioni restituisce 1 e restituisce righe 4
- 26. Perché il nome restituisce solo il cognome?
- 27. Perché non sin() restituisce il valore corretto?
- 28. Perché contare (false) restituire 1?
- 29. Perché il mio codice php restituisce inf?
- 30. Perché productIterator restituisce il tipo Iterator [Any]?
@developerbmw troverai che indossare il tuo cappello di matematica in Haskell è spesso vantaggioso. –