Verwendet lange, wo Anweisungen schlechten Codierungsstil?

8

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?

%Vor%

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.

    
Langston 18.07.2015, 20:39
quelle

3 Antworten

8

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 .

    
dfeuer 18.07.2015, 20:55
quelle
9

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.

%Vor%

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.)

    
Ørjan Johansen 18.07.2015 21:27
quelle
3

Ausgezeichnete Antworten schon von dfeuer und Ørjan Johansen, aber ich werde trotzdem meine paar Cent reinwerfen. Ich würde folgendes empfehlen:

  1. Nutzen Sie dies in erster Linie als Gelegenheit, die State monad zu studieren.
  2. Verwenden Sie die Statusmonade jedoch nicht für die Lösung, sondern verwenden Sie stattdessen das Paket 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.
  3. Es gibt eine Reihe von Bits hier, die von der Trennung dieser beiden Anliegen profitieren würden:
    • Generieren von zufälligen Werten.
    • Kombiniert sie zu größeren Ergebnissen.

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%     
Luis Casillas 19.07.2015 21:57
quelle

Tags und Links