2012-02-12 20 views

Respuesta

8

Lo que Stream representa es lazy y una lista potencialmente infinita. Dado que SML es eager, esto debe hacerse de una manera un poco indirecta. primer vistazo

Vamos de lo ordinario listas de trabajo:

datatype 'a list = [] | :: of 'a * 'a list 

Los contras consta de dos partes:

  • El primer elemento de la lista
  • El resto de la lista

En la lista perezosa, es bastante similar.

datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream) 

Aquí los contras consiste de los siguientes:

  • El primer elemento en la lista
  • Una función que produce el resto de la lista cuando se evaluó en ()

Por lo tanto, puede ver que el principio es muy similar, aunque un poco más difícil de trabajar. mirada

Vamos a una lista de ejemplo:

fun succ n = Cons (n, fn() => succ (n+1)) 
val naturals = succ 0 

¿Qué tiene esto produce? Vamos a examinarlo.

naturals se definió como succ 0, que a su vez se define como Cons(0, fn() => succ 1). De esto podemos ver que el primer elemento en la lista es 0.

Ahora vamos un paso más allá. Evaluamos fn() => succ 1, la segunda parte de nuestro Cons, en (), que produce succ 1, que a su vez es Cons(1, fn() => succ 2). Ahora podemos ver que el segundo elemento en la lista es 1.

Si repetimos este proceso, obtenemos que la lista representa la lista infinita [0, 1, 2, ...].

También puede ver esto tratando de hacer

val firstnats = take 10 naturals; 

y ver lo que hay.

1

Es uno de los dos constructores de Stream. Vea la segunda línea de esa captura de pantalla, eso es todo lo que hay para Cons.

Cuestiones relacionadas