2017-08-12 81 views
5

Chcę mieć nieskończoną listę funkcji, które przechodzą przez jakiś wzór. Na przykład: [(+), (-), (+), (-), ...]Jak powtórzyć listę funkcji w haskell

Jeśli zrobię coś podobnego

fmap repeat [(+), (-)] 

następnie uzyskać zagnieżdżonych list [[a -> a -> a]]. Jaki jest najlepszy sposób uzyskania pojedynczej nieskończonej listy funkcji po takim wzorcu?

+2

Możesz użyć 'concat (repeat [(+), (-)])'. Nie powtarzaj 'fmap repeat', które dawałoby ci wiele nieskończonych list, które musiałbyś scalić. – Bergi

+0

Dzięki. Myślałem, że mogę zastosować powtórzenie do zawartości listy, aby uniknąć zagnieżdżenia, ale zdaję sobie sprawę, dlaczego to nie zadziałałoby. – northlane

Odpowiedz

13

Co szukasz jest cycle :: [a] -> [a]:

cycle [(+),(-)]

Typ tego wyrażenia jest:

Prelude> :t cycle [(+),(-)] 
cycle [(+),(-)] :: Num a => [a -> a -> a] 

cycle pobiera listę [a] i tworzy listę gdzie dany wykaz jest powtarzany i jeszcze raz. Tak więc cycle [1,2,3] produkuje [1,2,3,1,2,3,1,2,3,1,...]