РЕДАКТИРОВАТЬ: Спасибо @interjay и @Antal Spector-Zabusky за объяснение, почему этот ответ опровергается. Они написали
Документация немного вводит в заблуждение. Значения жестко запрограммированы в компиляторе GHC. Через 48 лет вы наверняка знаете, что реальный код всегда превосходит документацию. - interjayчера @ andy256 Вы абсолютно правы в том, что документация плохая (действительно, именно поэтому Франциско задал этот вопрос в первую очередь), и ваше замешательство понятно. Особенность Haskell в том, что если эти значения String могут изменяться во время выполнения, это будет вопиющей ошибкой - переменные не могут изменяться. В этом значение конструктора типа IO - он представляет вычисление, которому разрешен доступ к «внешнему миру», и, следовательно, результат, который может измениться. Выполнение системного вызова является хорошим примером действия ввода-вывода. … [1/2] - Antal Spector-Zabusky 9 часов назад @ andy256… (Еще одним действием ввода-вывода может быть «обновление глобального счетчика».) Поэтому, когда мы видим строку, мы знаем, что она не может установить связь с ОС под капотом. Вот почему, возможно, удивительно, если вы не привыкли к Haskell, было бы нелегко реализовать os :: String для выполнения системного вызова - любое такое значение нереализуемо в базовом Haskell, нарушало бы ожидания каждого программиста о том, как программы работать, и, возможно, даже сбить с толку компилятор и оптимизатор (не теоретическая проблема - есть ответы на переполнение стека, где люди сталкиваются с аналогичными проблемами). [2/2] - Антал Спектор-Забуский Вот почему, возможно, удивительно, если вы не привыкли к Haskell, было бы нелегко реализовать os :: String для выполнения системного вызова - любое такое значение нереализуемо в базовом Haskell, нарушало бы ожидания каждого программиста о том, как программы работать, и, возможно, даже сбить с толку компилятор и оптимизатор (не теоретическая проблема - есть ответы на переполнение стека, где люди сталкиваются с аналогичными проблемами). [2/2] - Антал Спектор-Забуский Вот почему, возможно, удивительно, если вы не привыкли к Haskell, было бы нелегко реализовать os :: String для выполнения системного вызова - любое такое значение нереализуемо в базовом Haskell, нарушало бы ожидания каждого программиста о том, как программы работать, и, возможно, даже сбить с толку компилятор и оптимизатор (не теоретическая проблема - есть ответы на переполнение стека, где люди сталкиваются с аналогичными проблемами). [2/2] - Антал Спектор-Забуский и потенциально даже сбить с толку компилятор и оптимизатор (не теоретическая проблема - есть ответы о переполнении стека, где люди сталкиваются с аналогичными проблемами). [2/2] - Антал Спектор-Забуский и потенциально даже сбить с толку компилятор и оптимизатор (не теоретическая проблема - есть ответы о переполнении стека, где люди сталкиваются с аналогичными проблемами). [2/2] - Антал Спектор-Забуский
В настоящее время он имеет два голоса для удаления. Я позволю этому процессу идти своим чередом, но предполагаю, что он действительно имеет определенную ценность. С другой стороны, их объяснения показывают, что вопрос был слабым, как и ответы, так как новичок из Хаскелла мог легко следовать рассуждениям, которые я сделал.
Оригинальный ответ:
Я не программист на Haskell, но оба ответа уже не соответствуют документации, которую связал OP.
Моя интерпретация документации следующая.
os :: String
- Это дает вам «Операционная система, в которой работает программа».
Я ожидаю, что это выдаст системный вызов для получения информации. Поскольку система, в которой скомпилирована программа, может отличаться от той, в которой она выполняется, она не может быть значением, вставленным компилятором. Если код интерпретируется, то интерпретатор может предоставить результат, который должен быть получен с помощью системного вызова.
arch :: String
- Это дает вам «Архитектуру машины, на которой работает программа».
Опять же, я ожидаю, что это вызовет системный вызов для получения информации. Поскольку система, в которой скомпилирована программа, может отличаться от той, в которой она выполняется, она не может быть значением, вставленным компилятором.
compilerName :: String
- Это дает вам «реализацию на Haskell, с помощью которой программа была скомпилирована или интерпретируется».
Это значение, безусловно, вставляется компилятором / интерпретатором.
compilerVersion :: String
- Это дает вам «версию, compilerName
с которой программа была скомпилирована или интерпретируется».
Это значение, безусловно, вставляется компилятором / интерпретатором.
Хотя вы можете считать, что первые два вызова получают входные данные, результат получается из значений, хранящихся в операционной системе. Обычно ввод-вывод относится к доступу к вторичной памяти.
IO
там было что-то, есть обертка вокругuname(3)
Hackage: hackage.haskell.org/package/bindings-uname