EDIT: Grazie a @interjay e @Antal Spector-Zabusky per aver spiegato il motivo per cui questa risposta è stata annullata. Scrissero
La documentazione è un po 'fuorviante. I valori sono codificati nel compilatore GHC. Dopo 48 anni saprai sicuramente che il codice attuale supera sempre la documentazione. - interjay ieri @ andy256 Hai perfettamente ragione sul fatto che la documentazione non è buona (in effetti, questo fa parte del motivo per cui Francisco ha posto questa domanda in primo luogo) e la tua confusione è comprensibile. La cosa su Haskell è che se quei valori di String potrebbero variare in fase di esecuzione, sarebbe un bug egregio - le variabili non possono cambiare. Questo è il significato del costruttore del tipo IO: rappresenta un calcolo a cui è consentito accedere al "mondo esterno", e quindi uno il cui risultato può cambiare. Effettuare una chiamata di sistema è un buon esempio di azione IO. ... [1/2] - Antal Spector-Zabusky 9 ore fa @ andy256 ... (Un'altra azione IO potrebbe essere "l'aggiornamento di un contatore globale".) Quindi quando vediamo una stringa, sappiamo che non può essere in comunicazione con il sistema operativo sotto il cofano. Questo è il motivo, forse sorprendentemente se non sei abituato a Haskell, non sarebbe facile implementare os :: String per fare una chiamata di sistema - un tale valore non è implementabile in Haskell di base, violerebbe le aspettative di ogni programmatore su come i programmi funziona e potenzialmente fa scattare anche il compilatore e l'ottimizzatore (non una preoccupazione teorica: ci sono risposte Stack Overflow in cui le persone incontrano problemi analoghi). [2/2] - Antal Spector-Zabusky Questo è il motivo, forse sorprendentemente se non sei abituato a Haskell, non sarebbe facile implementare os :: String per fare una chiamata di sistema - un tale valore non è implementabile in Haskell di base, violerebbe le aspettative di ogni programmatore su come i programmi funziona e potenzialmente fa scattare anche il compilatore e l'ottimizzatore (non una preoccupazione teorica: ci sono risposte Stack Overflow in cui le persone incontrano problemi analoghi). [2/2] - Antal Spector-Zabusky Questo è il motivo, forse sorprendentemente se non sei abituato a Haskell, non sarebbe facile implementare os :: String per fare una chiamata di sistema - un tale valore non è implementabile in Haskell di base, violerebbe le aspettative di ogni programmatore su come i programmi funziona e potenzialmente fa scattare anche il compilatore e l'ottimizzatore (non una preoccupazione teorica: ci sono risposte Stack Overflow in cui le persone incontrano problemi analoghi). [2/2] - Antal Spector-Zabusky e potenzialmente anche far scattare il compilatore e l'ottimizzatore (non una preoccupazione teorica - ci sono risposte Stack Overflow in cui le persone incontrano problemi analoghi). [2/2] - Antal Spector-Zabusky e potenzialmente anche far scattare il compilatore e l'ottimizzatore (non una preoccupazione teorica - ci sono risposte Stack Overflow in cui le persone incontrano problemi analoghi). [2/2] - Antal Spector-Zabusky
Attualmente ha due voti per l'eliminazione. Lascerò che il processo segua il suo corso, ma suggerisco che abbia effettivamente un certo valore. In una nota a margine, le loro spiegazioni mostrano che la domanda era debole, così come le risposte, dal momento che un neofita di Haskell potrebbe facilmente seguire il ragionamento che ho fatto.
Risposta originale:
Non sono un programmatore Haskell, ma le due risposte già fornite non corrispondono alla documentazione collegata all'OP.
La mia interpretazione della documentazione segue.
os :: String
- Questo ti dà "Il sistema operativo su cui è in esecuzione il programma."
Mi aspetto che questo emetta una chiamata di sistema per ottenere le informazioni. Poiché il sistema su cui viene compilato il programma potrebbe essere diverso da quello su cui viene eseguito, non può essere un valore inserito dal compilatore. Se il codice viene interpretato, l'interprete può fornire il risultato, che deve essere ottenuto tramite una chiamata di sistema.
arch :: String
- Questo ti dà "L'architettura della macchina su cui è in esecuzione il programma".
Ancora una volta, mi aspetto che questo emetta una chiamata di sistema per ottenere le informazioni. Poiché il sistema su cui viene compilato il programma potrebbe essere diverso da quello su cui viene eseguito, non può essere un valore inserito dal compilatore.
compilerName :: String
- Questo ti dà "L'implementazione di Haskell con la quale il programma è stato compilato o viene interpretato".
Questo valore viene sicuramente inserito dal compilatore / interprete.
compilerVersion :: String
- Questo ti dà "La versione di compilerName
con cui il programma è stato compilato o viene interpretato".
Questo valore viene sicuramente inserito dal compilatore / interprete.
Sebbene si possa considerare che le prime due chiamate ottengano input, il risultato deriva dai valori conservati dal sistema operativo. L'I / O si riferisce generalmente all'accesso alla memoria secondaria.
IO
, c'è un wrapperuname(3)
disponibile su Hackage: hackage.haskell.org/package/bindings-uname