In der Concurrency-Bibliothek GHC.Conc gibt es eine Funktion namens numCapabilities
. Sein Typ ist und es gibt tatsächlich eine Zahl zurück, die Sie vom Befehlszeilen-Flag übergeben haben (z. B. 5
, wenn die Optionen +RTS -N 5
sind).Warum ist numCapabilities eine reine Funktion?
Jedoch getArgs
(Typ: IO [String]
) tut im Wesentlichen das gleiche (es gibt die ungeparsten Nicht-Laufzeitargumente zurück), ist aber keine reine Funktion.
Wenn die einzige Entschuldigung ist, dass numCapabilities
oft in reinem Code benötigt wird, in welcher Weise sind nicht andere Befehlszeilenoptionen nicht in reinem Code benötigt?
Bin mir etwas fehlt oder ist entweder numCapabilities
ein Designfehler oder darf ich folgendes Monster schreiben?
myGetArgs = unsafePerformIO getArgs
Ich frage mich jetzt das Gegenteil: Da der Wert von 'getArgs' nie während des Laufs des Programms ändert, ich bin mir nicht ganz sicher, warum es muss/sollte in' IO' sein. – sepp2k
Wie in einer der Antworten erwähnt, hängt es davon ab, wie man einen _pure_ Ausdruck definiert. Ich würde einen Ausdruck als _pure_ definieren, wenn er nicht von etwas anderem als dem Ausdruck selbst abhängt. Durch diese Definition ist 'numCapabilities' nicht rein, daher sollte ein Typ von' Int' als Designfehler betrachtet werden. Vielleicht interessieren Sie sich für Conal Elliotts Blogpost [Reinheitsvorstellungen in Haskell] (http://conal.net/blog/posts/notions-of-purity-in-haskell). –
'numCapabilities' muss den angegebenen Wert nicht an '-N' zurückgeben - es ruft nur 'getNumCapabilities' auf, gibt also viele Funktionen zurück, die es zu der Zeit gibt. Ich denke, das ist wirklich ein Fehler, aber es ist schwer zu sagen, auf welche Garantien man sich in den GHC-Modulen verlassen kann. –