In Haskell, alcune liste sono ciclici:La capacità di rilevare elenchi ciclici in Haskell interromperà qualsiasi proprietà della lingua?
ones = 1 : ones
Altri non sono:
nums = [1..]
E poi ci sono cose come questa:
more_ones = f 1 where f x = x : f x
Questo indica lo stesso valore di ones
e certamente quel valore è una sequenza ripetitiva. Ma se è rappresentato in memoria come una struttura ciclica dei dati è dubbia. (Un'implementazione potrebbe farlo, ma this answer explains that "it's unlikely that this will happen in practice".)
Supponiamo prendiamo un'implementazione Haskell e incidere in esso una funzione isCycle :: [a] -> Bool
incorporata che esamina la struttura della rappresentazione in memoria dell'argomento. Restituisce True
se l'elenco è fisicamente ciclico e False
se l'argomento è di lunghezza finita. Altrimenti, non riuscirà a terminare. (Immagino "hacking in" perché è impossibile scrivere quella funzione in Haskell.)
Sarebbe l'esistenza di questa funzione rompere le interessanti proprietà del linguaggio?
Bene, all'improvviso è possibile restituire valori diversi per gli stessi input: 'f x = se isCycle x then 1 else 2'. Ciò restituire '1' o' 2' per il valore 'ones' a seconda di come si costruisce quella stessa lista. Ciò sembra piuttosto grave se si considera che uno dei vantaggi più evidenti dei linguaggi funzionali è che una funzione restituirà sempre lo stesso risultato se gli stessi valori sono immessi in input ... – Bakuriu
Questo è sempre considerato accettabile quando vincolato a 'IO' . Puoi scrivere 'isCycle :: [a] -> IO Bool' in termini di una struttura esplicita del grafico di una lista ottenuta da [data-reify] (https://hackage.haskell.org/package/data-reify) che utilizza internamente ['StableName's] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Mem-StableName.html#t:StableName). Se guardi troppo in memoria con 'IO' puoi fare cose assolutamente malvagie, come [rompere la purezza delle funzioni pure senza ricorrere a qualcosa di non sicuro] (http://stackoverflow.com/a/28701687/414413). – Cirdec
Controllare se un elenco è fisicamente ciclico richiederebbe di controllare tutti i nodi finché non viene trovato un ciclo. Questo non finirà sulla lista infinita in Haskell. Comunque sarà in Lisp (e probabilmente in tutte le lingue imperative), perché la lista ciclica è l'unico modo per fare una lista infinita. – mb14