W Haskell, niektóre listy są cykliczne:Czy możliwość wykrycia cyklicznych list w Haskell złamie jakiekolwiek właściwości tego języka?
ones = 1 : ones
Inni nie są:
nums = [1..]
A potem są rzeczy tak:
more_ones = f 1 where f x = x : f x
To oznacza taką samą wartość jak ones
, a na pewno ta wartość jest powtarzającą się sekwencją. Ale to, czy jest reprezentowane w pamięci jako cykliczna struktura danych, jest wątpliwe. (Implementacja mógłby to zrobić, ale this answer explains that "it's unlikely that this will happen in practice".)
Załóżmy bierzemy realizację Haskell i włamać się do niego wbudowaną funkcję isCycle :: [a] -> Bool
który analizuje strukturę reprezentacji w pamięci argumentu. Zwraca True
, jeśli lista jest fizycznie cykliczna i False
, jeśli argument ma skończoną długość. W przeciwnym razie nie zakończy się. (Wyobrażam sobie "włamywanie go", ponieważ nie jest możliwe napisanie tej funkcji w Haskell.)
Czy istnienie tej funkcji mogłoby złamać interesujące właściwości języka?
Nagle możesz zwrócić różne wartości dla tych samych danych wejściowych: 'f x = jeśli isCycle x then 1 else 2'. To by zwróciło '1' lub' 2' dla wartości 'one' w zależności od tego, jak zbudujesz tę samą listę. Wydaje się to dość dużym złamaniem, biorąc pod uwagę, że jedną z najbardziej oczywistych zalet języków funkcjonalnych jest to, że funkcja zawsze zwraca ten sam wynik, jeśli podane są te same wartości na wejściu ... – Bakuriu
Jest to zawsze uważane za dopuszczalne tylko wtedy, gdy jest ograniczone do 'IO' . Możesz napisać 'isCycle :: [a] -> IO Bool' pod względem wyraźnej struktury wykresu listy uzyskanej z [data-reify] (https://hackage.haskell.org/package/data-reify), który wewnętrznie używa ['StableName's] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-Mem-StableName.html#t:StableName). Jeśli zbyt mocno zapamiętasz pamięć "IO", możesz zrobić absolutnie złe rzeczy, takie jak [przełamanie czystości czystych funkcji bez uciekania się do czegokolwiek "niebezpiecznego"] (http://stackoverflow.com/a/28701687/414413). – Cirdec
Sprawdzenie, czy lista jest fizycznie cykliczna, wymagałoby sprawdzenia wszystkich węzłów, dopóki nie zostanie znaleziony cykl. To nie zakończy się na nieskończonej liście w Haskell. Jednak będzie w Lisp (i prawdopodobnie wszystkich imperatywnych językach), ponieważ lista cykliczna jest jedynym sposobem na zrobienie nieskończonej listy. – mb14