Вы можете использовать свою собственную, не разделяющую реализацию, cycle
:
> _Y g = g (_Y g)
_Y :: (t -> t) -> t
> take 10 . _Y $ ([1,2,3] ++)
[1,2,3,1,2,3,1,2,3,1]
it :: Num a => [a]
> timeout 100000 . print . length . _Y $ ([1,2,3] ++)
Nothing
it :: Maybe ()
(0.11 secs, 152470624 bytes)
_Y
, конечно, выделит бесконечный, растущий список, в отличие от общего доступа cycle
, который эквивалентен fix ([1,2,3] ++)
, который создает реальный циклический список в памяти:
> timeout 100000 . print . length . fix $ ([1,2,3] ++)
<<<hangs>>>
Смотри также: