EDIT: Дякуємо @interjay та @Antal Spector-Zabusky за пояснення, чому ця відповідь не використовується. Вони писали
Документація трохи вводить в оману. Значення жорстко кодуються в компіляторі GHC. Після 48 років ви напевно знаєте, що фактичний код завжди перевершує документацію. - interjay вчора @ andy256 Ви абсолютно праві, що документація погана (справді, це частина того, чому Франциско задав це питання в першу чергу), і ваше плутанина зрозуміла. Справа в Haskell полягає в тому, що якщо ці значення String можуть змінюватися під час виконання, це буде немилої помилкою - змінні змін не дозволяється змінювати. У цьому полягає значення конструктора типу IO - він являє собою обчислення, яким дозволено отримати доступ до «зовнішнього світу», і так, той, результат якого може змінитися. Здійснення системного виклику - хороший приклад дії IO. ... [1/2] - Antal Spector-Zabusky 9 годин тому @ andy256… (Ще одна дія IO могла б бути "оновленням глобального лічильника".) Отже, коли ми бачимо String, ми знаємо, що він не може робити жодного зв'язку з ОС під кришкою. Ось чому, можливо, дивно, якщо ви не звикли до Haskell, реалізувати os :: String для системного виклику було б непросто - будь-яке таке значення в базовому Haskell є незмінним, порушує сподівання кожного програміста на те, як програми робота, і, можливо, навіть збільшити компілятор і оптимізатор (не теоретичне питання - є відповіді на переповнення стека, коли люди стикаються з аналогічними проблемами). [2/2] - Антал Спектор-Забуський Ось чому, можливо, дивно, якщо ви не звикли до Haskell, реалізувати os :: String для системного виклику було б непросто - будь-яке таке значення в базовому Haskell є незмінним, порушує сподівання кожного програміста на те, як програми робота, і, можливо, навіть збільшити компілятор і оптимізатор (не теоретичне питання - є відповіді на переповнення стека, коли люди стикаються з аналогічними проблемами). [2/2] - Антал Спектор-Забуський Ось чому, можливо, дивно, якщо ви не звикли до Haskell, реалізувати os :: String для системного виклику було б непросто - будь-яке таке значення в базовому Haskell є незмінним, порушує сподівання кожного програміста на те, як програми робота, і, можливо, навіть збільшити компілятор і оптимізатор (не теоретичне питання - є відповіді на переповнення стека, коли люди стикаються з аналогічними проблемами). [2/2] - Антал Спектор-Забуський і, можливо, навіть відключити компілятор та оптимізатор (що не є теоретичним питанням - є відповіді на переповнення стека, коли люди стикаються з аналогічними проблемами). [2/2] - Антал Спектор-Забуський і, можливо, навіть відключити компілятор та оптимізатор (що не є теоретичним питанням - є відповіді на переповнення стека, коли люди стикаються з аналогічними проблемами). [2/2] - Антал Спектор-Забуський
Наразі це два голоси видалення. Я дозволю цьому процесу прийняти його, але припустимо, що він насправді має деяке значення. Зі сторони їх пояснення показують, що питання було слабким, а також відповіді, оскільки новачок Haskell міг легко слідувати міркуванням, які я робив.
Оригінальна відповідь:
Я не програміст Haskell, але два наведені відповіді не відповідають документації, з якою пов'язана ОП.
Моє тлумачення документації випливає.
os :: String
- Це дає вам "Операційну систему, на якій працює програма".
Я очікую, що це видасть системний виклик для отримання інформації. Оскільки система, з якої складається програма, може відрізнятися від тієї, на якій вона працює, не може бути значенням, вставленим компілятором. Якщо код інтерпретується, то інтерпретатор може надати результат, який необхідно отримати через системний виклик.
arch :: String
- Це дає вам "Машинна архітектура, на якій працює програма".
Знову ж таки, я очікую, що це видасть системний виклик для отримання інформації. Оскільки система, з якої складається програма, може відрізнятися від тієї, на якій вона працює, не може бути значенням, вставленим компілятором.
compilerName :: String
- Це дає вам "реалізацію Haskell, з якою програма була складена або інтерпретується".
Це значення, безумовно, вставляється компілятором / інтерпретатором.
compilerVersion :: String
- Це дає "Версію compilerName
з якою програма була складена або інтерпретується".
Це значення, безумовно, вставляється компілятором / інтерпретатором.
Хоча ви можете вважати, що перші два дзвінки є вхідними, результат отримується від значень, що зберігаються в операційній системі. Введення / виведення, як правило, відноситься до вторинного доступу до сховища.
IO
там, тоuname(3)
на Hackage доступна обгортка: hackage.haskell.org/package/bindings-uname