Hier habe ich eine Funktion einen Strom von Zufallszahlen zwischen 0 und 999.Haskell Zufallszahl mit einem Anstand ohne explizite Rekursion
randomHelp :: RandomGen g => g -> [Int]
randomHelp g = zipWith (mod) (map fst $ iterate (next . snd) $ next $ snd $ split g) $ repeat 1000
Ich mag alle Nummern wählen aus dem Stream oben definiert würde zu erzeugen und jeder elem(i)
und elem(i + 1)
muss eine Anständigkeit respektieren. Zum Beispiel muss ihr gcd eins sein. Alles, was ich denken kann, ist eine Faltfunktion mit, weil ich mit einem Akkumulator beginnen kann, der die Zahl 1 enthält (angenommen, 1 ist das erste Element, das ich zeigen möchte), dann überprüfe ich die Korrektheit in der Funktion von falten und wenn es respektiert wird, füge ich hinzu das Element zum Akkumulator, aber das Problem sind die Programmblöcke wegen Stackoverflow, denke ich. Hier
ist die Funktion:
randomFunc :: RandomGen g => g -> [Int]
randomFunc g = foldl (\acc x -> if (gcd x (last acc) == 1) then acC++ [x] else acc) [1] (randomHelp g)
Anmerkung: Ich möchte nicht explizite Rekursion verwenden.
Ich verstehe nicht wirklich, wie das funktioniert? Kannst du mir erklären? – zaig
@zaig dies ist eine Anwendung von 'foldr :: Faltbare t => (a -> b -> b) -> b -> ta -> b' wo' b' selbst ist eine Funktion, wie 'c -> d ', so würde die Signatur sein: (a -> (c -> d) -> c -> d) -> (c -> d) -> ta -> c -> d '. wenn du folgst sollte die signatur sinnvoll sein wie es funktioniert –
ich verstehe immer noch nicht wer die funktion f ist? Bei der Reihenfolge würde ich sagen, dass es "randomRs" ist, wenn go aufgerufen wird, aber "randomRs" braucht einen Generator und "lst" und "x" sind keine Generatoren. Ich bin immer noch ein wenig verwirrt. Was vermisse ich? – zaig