2011-01-13 7 views
0

Es würde eine zufällige Reihenfolge der öffnenden geschweiften Klammern und eine passende Folge von schließenden Klammern machen. Hier ist meine (Teil-) Code:Verwenden Sie eine zufällige Variable mehrmals in Haskell

shuffle :: [a] -> IO [a] 
ps xs ys = map snd . sort $ zip xs ys 

opens = "[{(" 
closes = "]})" 

parens = do 
ord <- shuffle [0..length opens] 
    let os = ps ord opens 
     cs = reverse $ ps ord closes 

Es funktioniert nicht, da es eine neue ord für jeden Shuffle erzeugt. Wie kann ich es an die ord erinnern und es für beide Shuffle verwenden?

+0

Ich denke, es wäre einfacher, Ihre Frage zu beantworten, wenn Ihr Code weniger partiell wäre (gibt uns etwas, das zumindest korrekte Syntax ist.) Im Moment ist es schwer zu sehen, was genau Ihr Problem ist. – HaskellElephant

Antwort

0

Mischen Sie sie nicht getrennt.

Mischen Sie die zip ped-Sequenz und unzip, wenn Sie fertig sind.

0

Haben Sie Olegs Provably perfect shuffle algorithms oder die System.Random.Shuffle Implementierung gesehen?

Nach erneutem Lesen Ihres (sehr unvollständigen) Codes scheint es, dass korrekt sein könnte, was einige Annahmen über den umgebenden Code macht. Bitte zeigen Sie mehr, damit wir feststellen können, was falsch ist.

Nebenbei, mit map fst . sortBy (comparing `on` fst) . zip xs oder map fst . sortWith fst . zip xs würde deutlicher zum Ausdruck bringen, dass Ihre Absicht ist, eine Liste von einem anderen zu bestellen.

Verwandte Themen