EDIT: Vielen Dank an @interjay und @Antal Spector-Zabusky für die Erklärung, warum diese Antwort abgelehnt wird. Sie schrieben
Die Dokumentation ist etwas irreführend. Die Werte sind im GHC-Compiler fest codiert. Nach 48 Jahren wissen Sie sicher, dass der eigentliche Code immer die Dokumentation übertrifft. - interjay gestern @ andy256 Sie haben absolut Recht, dass die Dokumentation schlecht ist (in der Tat, deshalb hat Francisco diese Frage überhaupt gestellt), und Ihre Verwirrung ist verständlich. Die Sache mit Haskell ist, dass wenn diese String-Werte zur Laufzeit variieren könnten, dies ein ungeheurer Fehler wäre - Variablen dürfen sich nicht ändern. Dies ist die Bedeutung des IO-Typkonstruktors - er stellt eine Berechnung dar, die auf die "Außenwelt" zugreifen darf und deren Ergebnis sich ändern kann. Ein Systemaufruf ist ein gutes Beispiel für eine E / A-Aktion. … [1/2] - Antal Spector-Zabusky vor 9 Stunden @ andy256… (Eine weitere E / A-Aktion könnte darin bestehen, einen globalen Zähler zu aktualisieren.) Wenn wir also einen String sehen, wissen wir, dass keine Kommunikation mit ihm möglich ist das Betriebssystem unter der Haube. Dies ist der Grund, warum es, vielleicht überraschend, wenn Sie nicht an Haskell gewöhnt sind, nicht einfach wäre, os :: String für einen Systemaufruf zu implementieren - ein solcher Wert ist in Haskell nicht implementierbar und würde die Erwartung jedes Programmierers verletzen, wie Programme ausgeführt werden arbeiten und möglicherweise sogar den Compiler und den Optimierer auslösen (kein theoretisches Problem - es gibt Stack Overflow-Antworten, bei denen Menschen auf analoge Probleme stoßen). [2/2] - Antal Spector-Zabusky Dies ist der Grund, warum es, vielleicht überraschend, wenn Sie nicht an Haskell gewöhnt sind, nicht einfach wäre, os :: String für einen Systemaufruf zu implementieren - ein solcher Wert ist in Haskell nicht implementierbar und würde die Erwartung jedes Programmierers verletzen, wie Programme ausgeführt werden arbeiten und möglicherweise sogar den Compiler und den Optimierer auslösen (kein theoretisches Problem - es gibt Stack Overflow-Antworten, bei denen Menschen auf analoge Probleme stoßen). [2/2] - Antal Spector-Zabusky Dies ist der Grund, warum es, vielleicht überraschend, wenn Sie nicht an Haskell gewöhnt sind, nicht einfach wäre, os :: String für einen Systemaufruf zu implementieren - ein solcher Wert ist in Haskell nicht implementierbar und würde die Erwartung jedes Programmierers verletzen, wie Programme ausgeführt werden arbeiten und möglicherweise sogar den Compiler und den Optimierer auslösen (kein theoretisches Problem - es gibt Stack Overflow-Antworten, bei denen Menschen auf analoge Probleme stoßen). [2/2] - Antal Spector-Zabusky und möglicherweise sogar den Compiler und den Optimierer auslösen (kein theoretisches Problem - es gibt Stack Overflow-Antworten, bei denen Menschen auf analoge Probleme stoßen). [2/2] - Antal Spector-Zabusky und möglicherweise sogar den Compiler und den Optimierer auslösen (kein theoretisches Problem - es gibt Stack Overflow-Antworten, bei denen Menschen auf analoge Probleme stoßen). [2/2] - Antal Spector-Zabusky
Es hat derzeit zwei Löschstimmen. Ich werde diesen Prozess seinen Lauf nehmen lassen, aber vorschlagen, dass er tatsächlich einen gewissen Wert hat. Nebenbei bemerkt, ihre Erklärungen zeigen, dass die Frage schwach war, ebenso wie die Antworten, da ein Haskell-Neuling leicht der Argumentation folgen konnte, die ich gemacht habe.
Ursprüngliche Antwort:
Ich bin kein Haskell-Programmierer, aber die beiden bereits gegebenen Antworten stimmen nicht mit der Dokumentation überein, die das OP verknüpft hat.
Meine Interpretation der Dokumentation folgt.
os :: String
- Dies gibt Ihnen "Das Betriebssystem, auf dem das Programm ausgeführt wird."
Ich gehe davon aus, dass dies einen Systemaufruf auslöst, um die Informationen zu erhalten. Da sich das System, auf dem das Programm kompiliert wird, möglicherweise von dem unterscheidet, auf dem es ausgeführt wird, kann es kein vom Compiler eingefügter Wert sein. Wenn der Code interpretiert wird, kann der Interpreter das Ergebnis bereitstellen, das über einen Systemaufruf abgerufen werden muss.
arch :: String
- Dies gibt Ihnen "Die Maschinenarchitektur, auf der das Programm ausgeführt wird."
Auch hier erwarte ich, dass dies einen Systemaufruf auslöst, um die Informationen zu erhalten. Da sich das System, auf dem das Programm kompiliert wird, möglicherweise von dem unterscheidet, auf dem es ausgeführt wird, kann es kein vom Compiler eingefügter Wert sein.
compilerName :: String
- Dies gibt Ihnen "Die Haskell-Implementierung, mit der das Programm kompiliert wurde oder interpretiert wird."
Dieser Wert wird sicherlich vom Compiler / Interpreter eingefügt.
compilerVersion :: String
- Dies gibt Ihnen "Die Version, compilerName
mit der das Programm kompiliert wurde oder interpretiert wird."
Dieser Wert wird sicherlich vom Compiler / Interpreter eingefügt.
Während Sie möglicherweise davon ausgehen, dass die ersten beiden Aufrufe Eingaben erhalten, stammen die Ergebnisse aus Werten, die vom Betriebssystem gehalten werden. E / A bezieht sich im Allgemeinen auf den sekundären Speicherzugriff.
IO
, gibtuname(3)
es auf Hackage einen Wrapper : hackage.haskell.org/package/bindings-uname