devo definire un elenco in cui:Haskell, definisce una lista infinita, aggiunge dati al volo e ordina allo stesso tempo. Come?
- 1 è un membro
- se n è un membro, quindi sono 2n + 1 e 3n + 1
Così la lista è infinita e deve essere ordinato. Una volta caricato a GHCi, il comando:
"take 10 theList"
produrrà:
[1,3,4,7,9,10,13,15,19,21]
Qui di seguito sono i miei codici:
theList = ([1] ++ concat [[(x*2+1),(x*3+1)]|x<-theList])
Sembra funzionare, tranne per ciò che non è ordinato, il lo stesso comando come sopra produce:
[1,3,4,7,10,9,13,15,22,21]
Qualcuno ha qualche idea per risolverlo? Grazie
La funzione 'allInOne' è precisamente [' concat'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:concat). Haskell ha molte funzioni "built-in" che puoi cercare per tipo di firma usando [Hoogle] (http://www.haskell.org/hoogle/) (è uno degli strumenti che rende Haskell incredibile!), Ad es. 'allInOne' ha tipo' [[a]] -> [a] 'e [il primo risultato] (http: //www.haskell.org/hoogle/? hoogle = \ [\ [a \] \] + - % 3E + \ [a \]) è quello che stai cercando. :) – huon
C'è una bella implementazione naturale che coinvolge _corecursion_. In un certo senso assomiglia alla lista infinita di numeri di Fibonacci: 'fibs = 0: 1: zipWith (+) fibs (fib di coda)'. Come estenderesti la lista quando hai già "la lista" di una certa dimensione? – Vitus