2015-11-16 17 views

Antwort

17

Listen bilden Struktur, mit assoziativer ++ eine Monoid binärer Operation und neutrales Element []. Das heißt, wir haben

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

Inzwischen Zahlen viele Monoid Struktur haben, aber die entsprechenden hier ist, dass, wenn der Betrieb * und das neutrale Element ist 1.

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

Die product Funktion ist nicht nur eine Karte aus Listen von Zahlen Zahlen: es ist ein Monoid-Homomorphismus, die Liste Monoid Struktur in dem numerischen Monoid widerspiegelt. Entscheidend ist,

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

und

product [] = 1 

In der Tat, die ersteren zu bekommen, wir haben so ziemlich die letztere uns aufgezwungen.

2

Produkt ist ein Falz mit Anfangswert von 1, wenn so eine leere Liste Klapp den Init-Wert nur zurückkehrt, wich 1.

Ein Beispiel für eine Produktimplementierung es mitströmen ist:

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

Werfen Sie einen Blick auf fold, um richtig zu verstehen.

7

Es ist eine mathematische Sache - Sie in der Regel eine leere Summe definieren 0 und ein leeres Produkt 1 zu sein, weil dies Ihre übliche Gesetze so schön passt

Sie zum Beispiel die induktive Definition eines Produktes rechtfertigen - see Wikipedia

7

Weil das die Identität in der Kategorie der Multiplikation ist.

Um praktischer zu sein:

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

Was wiederum ermöglicht es Ihnen, es mit einer einfachen Rekursion zu implementieren:

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

@developerbmw Sie werden feststellen, dass das Tragen Ihrer Mathe Hut in Haskell ist oft von Vorteil. –

Verwandte Themen