Próbuję zgiąć głowę wokół stałych punktów i definicji rekursywnych.Dlaczego "fix" haskella wydaje się mieć problemy z krotkami?
to działa:
>>> take 10 $ let x = (0:x) in x
[0,0,0,0,0,0,0,0,0,0]
To nie to samo, co ma sens, biorąc pod uwagę definicję fix
:
>>> take 10 $ fix (\x -> (0:x))
[0,0,0,0,0,0,0,0,0,0]
Załóżmy teraz zacznę bawić z rekurencyjnie zdefiniowanych parach:
>>> take 10 $ fst $ let (u,v) = (0:v,1:u) in (u,v)
[0,1,0,1,0,1,0,1,0,1]
Okej, powinienem móc napisać to z fix
też, prawda?
>>> take 10 $ fst $ fix (\(u,v) -> (0:v,1:u))
*** Exception: <<loop>>
Ale to nie działa. Jeśli nie dokonam następującej pozornie banalnej zmiany:
>>> take 10 $ fst $ fix (\r -> let (u,v)=r in (0:v,1:u))
[0,1,0,1,0,1,0,1,0,1]
Jaka jest zasadnicza różnica między dwoma ostatnimi przykładami?
To powinno być '\ (~ (u, v))' lub '\ ~ (u, v)' – redneb
@redneb Naprawiono. (kalambur przeznaczony :-P) – chi