Listenverständnis in Haskell

7

Ich habe den folgenden Code verwendet, um alle Kombinationen einer vorgegebenen Anzahl von Zahlen zu erhalten:

%Vor%

Das war in Ordnung, aber ich möchte das Programm erweitern, um sehr große Listen zu bearbeiten, und ich denke, dass es einen besseren Weg dafür geben muss. Wie würde ich eine Funktion erstellen, die denselben Parameter x wie hier verwendet, und einen weiteren Parameter für die Anzahl der Elemente, die die Unterlisten haben. Für vier Elemente würde ich gehen und den Code ändern:

%Vor%

Es muss kein Listenverständnis sein. Danke für jede Hilfe.

    
Sliderton 12.05.2011, 18:24
quelle

2 Antworten

17

Ich glaube, was Sie wollen, wäre die Funktion replicateM in Control.Monad .

Die Listen-Monade basiert auf "alle möglichen Kombinationen ausprobieren", und plain replicate erstellt eine Liste, indem ein Element mehrmals wiederholt wird. Das Ergebnis von replicateM ist also, bei einer Liste möglicher Werte, eine Liste aller möglichen Möglichkeiten, ein Objekt aus dieser Liste einige Male auszuwählen.

Zum Beispiel:

%Vor%

Um Ihre Funktion auf beliebige Wiederholungen zu erweitern, verwenden Sie etwas wie:

%Vor%

... wobei Ihre ursprüngliche getList äquivalent zu getListN 3 wäre.

    
C. A. McCann 12.05.2011, 18:32
quelle
3

Falls jemand eine nicht-monadische Lösung mag, um die inneren Abläufe zu verstehen (obwohl die Lösung über replicateM großartig ist!):

%Vor%

Im Wesentlichen funktioniert diese Implementierung über foldl genauso wie die replacatM -solution.

    
phynfo 13.05.2011 08:04
quelle

Tags und Links