Относительно (при исполнении) в Haskell IO Monad
У меня нет проблем с IO Monad. Но я хочу понять следующее:
- Во всех / почти учебниках / учебниках по Haskell говорится, что getChar не является чистой функцией, потому что она может дать вам другой результат. Мой вопрос: кто сказал, что это функция в первую очередь. Если вы не дадите мне реализацию этой функции, а я не изучу ее, я не могу гарантировать, что она чистая. Так где же эта реализация?
- Во всех / почти учебниках / учебниках по 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
,
Я надеюсь, что это рассеивает, по крайней мере, часть вашего замешательства.