Wenn wir die documentation of scanl :: (b -> a -> b) -> b -> [a]
schauen wir sehen, dass:
scanl :: (b -> a -> b) -> b -> [a] -> [b]
scanl foldl ist ähnlich, aber gibt eine Liste von aufeinanderfolgenden reduziert Werte von links:
scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]
Beachten Sie, dass
last (scanl f z xs) == foldl f z xs.
So beginnt es mit n Anfangswert z
, und jedes Mal, es gilt eine Funktion zu z
und das nächste Element der angegebenen Liste.
Hier ist der Anfangswert ist g
, und die Liste ist replicate n playRound
(die eine Liste von n
Elemente bedeutet, jedes Element ist playRound
). Die Funktion nimmt hier den Akkus
, und ein Element der Liste (hier immer playRound
), und das Ergebnis f s
(in diesem Fall playRound s
), ist das nächste Element in der Liste.
So wird es eine Liste erzeugen:
[g, playRound g, playRound (playRound g), ...]
und die Liste n+1
Artikel enthalten wird.
Wahrscheinlich ein eleganter Ansatz hätte sein sollen:
run :: Grid -> Int -> [Grid]
run g n = take (n+1) $ iterate playRound g
'f' der zweite Parameter des Lambda-Ausdruck ist. –