2016-06-18 8 views
1

Ich bin ein Anfänger in Haskell und ich versuche, ein einfaches Programm zu machen, die eine Liste zB [-3,8] nimmt und die unendliche Liste: [-3,8,-3,8,-3,8,...]Infinite Listen in Haskell mit vordefinierten Funktionen

Dank Haskells lazy evaluation I habe ein sehr einfaches Programm geschrieben, das es berechnet:

period :: [a]->[a] 
period p = p ++ period p 

ich würde gerne wissen, ob es eine einfachere Lösung mit hohen Ordnung Funktionen (iterate, Karte, ...)

+4

Betrachten Sie mit [Hoogle] (https: // www. haskell.org/hoogle/?hoogle=%5Ba%5D+-%3E+%5Ba%5D) das nächste Mal. Es ist eine Suchmaschine für Haskell. Sie können nach Name oder nach Typ suchen (siehe die verknüpfte Suche und wie das erste Ergebnis genau "Zyklus" ist). – Bakuriu

Antwort

9

Der erste Platz Suche nach Liste fu In der Regel ist Data.List. Dort finden Sie

cycle :: [a] -> [a] 

was genau das tut, was Sie wollen. Es ist jedoch ein wenig anders definiert, um eine kreisförmige Liste anstelle einer unendlichen Liste zu erstellen. So etwas wie

cycle xs = ys where ys = xs ++ ys 

Dies kann viel unnötige Speicherzuweisung vermeiden. Sie können diese Definition ausdrücken Data.Function.fix mit:

cycle xs = fix (xs ++) 

Wenn Sie zu lieben über verallgemeinern, können Sie dies für die allgemeine Semigroup s definieren

cycle xs = fix (xs <>) 

mit, obwohl dies für die meisten Halbgruppen auseinanderlaufen wird.

Wenn Sie einen Punkt freien Fanatiker sind, können Sie diese übersetzen zu

cycle xs = fix ((<>) xs) 

die Sie dann sehen kann, ist

cycle = fix . (<>) 
+2

Die Schönheit von 'fix. (<>) lässt den punktfreien Fanatiker in mir weinen, aber das ist sogar aus einer pragmatischen Perspektive ziemlich sauber. – leftaroundabout

Verwandte Themen