Ich bin ein Haskell-Neuling, also weiß ich nicht viel über den Programmierstil. Ich habe eine Funktion, die viele zufällige Generatoren kettet. Wird diese Art Code in schlechtem Stil betrachtet, wobei ich ~ 10 Zeilen nach einer where
Aussage habe? Wenn ja, welche Alternativen gibt es?
Da dies ein etwas subjektives Thema sein könnte, beschränken Sie bitte die Antworten auf die Haskell Community-Code-Normen und nicht auf Ihre persönliche Meinung / Ästhetik.
Ich bin mir der Möglichkeit bewusst, getStdRandom
zu verwenden, möchte aber hier vorzugsweise eine reine Funktion verwenden.
Ja! Dies ist die Art von Situation, in der eine staatliche Monade (oder sogar, genauer gesagt, eine Zufälligkeits-Monade) wirklich nützlich ist. Damit können Sie Berechnungen zusammenführen, die alle eine Art von Zustand transformieren, in diesem Fall den Zufallssamen. Siehe beispielsweise Control.Monad.State
oder suchen Sie nach MonadRandom
.
Hier können Sie auf Wunsch die Funktion mit State
auf die direkteste Weise umschreiben. Beachten Sie, dass die Signatur des Top-Level-Typs nicht geändert wurde.
Normalerweise würden Sie die meisten Verwendungen von state $
vermeiden, indem Sie die Funktionen des Dienstprogramms wie randomChoice
bereits in der State
monad definieren. (Dies ist mehr oder weniger Teil dessen, was das Paket MonadRandom
tut.)
Ausgezeichnete Antworten schon von dfeuer und Ørjan Johansen, aber ich werde trotzdem meine paar Cent reinwerfen. Ich würde folgendes empfehlen:
State
monad zu studieren. MonadRandom
. Der Rand
-Typ von dort ist ein spezieller newtype
-Wrapper um State
mit benutzerdefinierten Operationen für die Zufälligkeit und macht den Code leichter lesbar. Zum Beispiel würde ich dies wie folgt in eine eigene Funktion aufteilen:
%Vor%Da dies das Ergebnis ist, das Sie zurückgeben, nennen wir es die "Hauptsache", die Sie versuchen zu tun - der Großteil des anderen Codes ist dem Zuführen zufälliger Argumente in diese Funktion untergeordnet. Aber das teilt sich in zwei Teile: (a) Erzeugen der zufälligen "Wörter" und (b) Mischen derselben. Lassen Sie uns zuerst eine Funktion für (b) schreiben, vorausgesetzt, Sie haben die Wörter bereits, aber nicht gemischt:
%Vor% (Ich nehme an, dass shuffle
neu geschrieben wurde, um MonadRandom
zu verwenden. Außerdem habe ich diesen Code nicht getestet, es gibt wahrscheinlich dumme Fehler darin. Aber das ist alles eine Übung für dich !)
Die Erzeugung einer zufälligen Auflösung sieht wie eine komplex genug aussagekräftige Einheit aus, um sich ebenfalls zu teilen:
%Vor%Nun, alles zusammenbinden:
%Vor%Tags und Links haskell random coding-style where