2017-05-01 4 views
2

Ich habe diese Daten und Typen:Haskell - unendliche Liste -

data Cliente = Uncliente {nombre::String,resistencia::Int,bebidas::[Bebida],amigos::[Cliente]} deriving (Show) 

type Bebida = Cliente -> Cliente 

type Nombre = String 
type Duracion = Float 
type Acciones = [Bebida] 
type Itinerario = (Nombre,Duracion,Acciones) 

Und ich habe diesen Slogan:

„definieren Chucknorris, die ein Kunde, der ursprünglich genannt wurde‚Chuck‘, Widerstand 1000, ist Anas Freund und nahm alle Sodas, die im Universum existieren, beginnend mit einem Level 1 Soda, dann ein Level 2 Soda, und so weiter. "

, und ich tue:

chuckNorris = Uncliente { 
    nombre = "Chuck", 
    resistencia = 1000, 
    bebidas = [soda 1,2..], 
    amigos = [ana] 

Aber das funktioniert nicht, weil die unendliche Liste von Getränken ist nicht wie, dass

Wie würden Sie die unendliche Liste schreiben?

wie Soda 1, soda 2, soda 3 ........

Antwort

3

Ich würde es schreiben, wie map soda [1,2..]

map effektiv jedes Element in der Liste nimmt (1, 2, 3 und so weiter) und wendet soda darauf an, resultierend in einer anderen Liste mit soda 1, soda 2, soda 3 und so weiter.

3

Der Weg dazu ist über die map Funktion. Unbegrenzte Listen, die durch 1 schreiten, können mit der .. Syntax getan werden.

map soda [1..] 

Dies ist semantisch äquivalent zu so etwas wie

[soda 1, soda 2, soda 3, {- and so on... -}] 

Der Grund dies funktioniert dank Haskells lazy evaluation ist. Die Aufrufe an soda treten erst auf, wenn Sie die unendliche Liste durchlaufen haben, also müssen Sie sich nicht davor fürchten, in einer Endlosschleife gefangen zu werden.