Относительно (при исполнении) в Haskell IO Monad

У меня нет проблем с IO Monad. Но я хочу понять следующее:

  1. Во всех / почти учебниках / учебниках по Haskell говорится, что getChar не является чистой функцией, потому что она может дать вам другой результат. Мой вопрос: кто сказал, что это функция в первую очередь. Если вы не дадите мне реализацию этой функции, а я не изучу ее, я не могу гарантировать, что она чистая. Так где же эта реализация?
  2. Во всех / почти учебниках / учебниках по Haskell сказано, что, скажем, (IO String) это действие, которое (при выполнении) может вернуть вам значение типа String. Это нормально, но у кого / где происходит это исполнение. Конечно! Компьютер выполняет это выполнение. Это тоже нормально. но так как я только начинающий, я надеюсь, что вы простите меня спросить, где рецепт этого "казни". Я предполагаю, что это не написано на Haskell. Означает ли эта более поздняя идея, что, в конце концов, программа на Haskell преобразуется в C-подобную программу, которая в конечном итоге будет преобразована в Assembly -> Machine code? Если так, где можно найти реализацию вещей ввода-вывода в Haskell?

Большое спасибо

1 ответ

Решение

Функции на Haskell отличаются от вычислений.

Вычисление - это часть императивного кода (возможно, написанного на C или Assembler, а затем скомпилированного в машинный код, непосредственно исполняемый на процессоре), который по своей природе эффективен и даже неограничен по своим последствиям. То есть после запуска вычисления могут получить доступ и изменить любую память и выполнять любые операции, такие как взаимодействие с клавиатурой и экраном или даже запуск ракет.

Напротив, функция на чистом языке, такая как Haskell, не может изменять произвольную память и запускать ракеты. Он может изменять только свой личный раздел памяти и возвращать результат, указанный в его типе.

Так что, в некотором смысле, Haskell - это язык, который ничего не может сделать. Хаскель бесполезен. Это было серьезной проблемой в течение 1990-х годов, пока IO был интегрирован в Haskell.

Теперь IO a значение - это ссылка на отдельно подготовленное вычисление, которое, как мы надеемся, a, Вы не сможете создать IO a из чистых функций Haskell. Все IO Примитивы разработаны отдельно и упакованы в GHC. Затем вы можете объединить эти простые вычисления в менее тривиальные, и в конечном итоге ваша программа может иметь любые эффекты, которые вы пожелаете.

Одно замечание: чистые функции отделены друг от друга, они могут влиять друг на друга, только если вы используете их вместе. Вычисления, с другой стороны, могут свободно взаимодействовать друг с другом (как я уже говорил, они обычно могут делать все что угодно) и поэтому могут (и могут) случайно сломать друг друга. Вот почему в программном обеспечении написано так много ошибок на императивных языках! Итак, в Haskell вычисления хранятся в IO,

Я надеюсь, что это рассеивает, по крайней мере, часть вашего замешательства.

Другие вопросы по тегам