2016-07-25 28 views
6

Betrieb >> Beschreibung ist die folgende:kann nicht Ergebnis der Monade verstehen >> Anwendung

Sequenziell zwei Aktionen zusammenstellen, einen beliebigen Wert durch die erste erzeugte Verwerfen, wie Sequenzierung Operatoren (wie das Semikolon) im Imperativ Sprachen.

Hier ist das Beispiel, das ich verwirrt:

> ([1] ++ [2]) >> ([2] ++ [3]) 
[2,3,2,3] 

Ich erwarte die Liste [2,3], das Ergebnis des rechten Teils des Ausdrucks wäre. Wie kann das Ergebnis von [2,3,2,3] erklärt werden?

+2

'(>>)' die _values_ 'verworfen 1 'und' 2 ', aber das bedeutet nicht, dass' x >> y === y' ... – Alec

+0

Mit einfacheren Beispiel bekomme ich was ich erwartet hatte: [1] >> [2] Ergebnisse [2] – Scipio

+2

Probier es mal mit verschiedenen Typen aus. Z.B. '[1,2] >> ['a']' – pdexter

Antwort

12

(>>) ist standardmäßig definiert als

a >> b = a >>= (\_ -> b) 

so wird der Wert ignoriert wird ein a in einem gegebenen Wert monadischen m a. Die Art der >>= zur Liste spezialisiert ist:

(>>=) :: [a] -> (a -> [b]) -> [b] 

l >>= f ruft f für jedes Element der Liste l zur Produkt eine Liste von Listen, die dann verkettet ist.

z.B.

[1,2] >>= (\i -> [i, -i]) 
> [1,-1,2,-2] 

Ignorieren jedes Eingabeelement und die Rückgabe des Werts [2,3] in n Kopien der Liste [2,3] für eine Eingangsliste von Länge führen wird n

z.B.

[1] >>= (\_ -> [2,3]) 
> [2,3] 

[1,2] >>= (\_ -> [2,3]) 
> [2,3,2,3] 

dieses zweite Beispiel entspricht ([1] ++ [2]) >> ([2] ++ [3]) in Ihrer Frage.

7

Eine kleine Ergänzung zur Antwort von Lee:

([1] ++ [2]) >> ([2] ++ [3]) 

ist

([1] ++ [2]) >> ([2] ++ [3]) >>= \x -> return x 

zu

Äquivalent was

([1] ++ [2]) >>= \y -> ([2] ++ [3]) >>= \x -> return x 

äquivalent ist, die zu

[ x | y <- [1]++[2] , x <- [2]++[3] ] 
entspricht

die den Imperativ Pseudo-Code der Nähe

for y in [1]++[2]: 
    for x in [2]++[3]: 
     print x