Считайте unsafePerformIO
обещанием для компилятора. Он говорит: «Я обещаю, что вы можете рассматривать это действие ввода-вывода, как если бы оно было чистой ценностью, и ничто не пойдет не так». Это полезно, потому что бывают случаи, когда вы можете создать чистый интерфейс для вычислений, реализованных с нечистыми операциями, но для компилятора невозможно проверить, когда это так; вместо этого unsafePerformIO
позволяет вам положить руку на ваше сердце и поклясться, что вы убедились, что нечистые вычисления действительно чисты, поэтому компилятор может просто поверить, что это так.
newUnique
была чистой функцией, то let x = newUnique () in (x, x)
и (newUnique (), newUnique ())
были бы эквивалентными выражениями. Но вы бы хотели, чтобы эти два выражения имели разные результаты; пара дубликатов с одинаковым значением Unique
в одном случае и пара двух разных значений Unique
в другом. С вашим кодом действительно невозможно сказать, что означает любое выражение. Их можно понять только с учетом фактической последовательности операций, которые программа будет выполнять во время выполнения, и контроль над этим - именно то, от чего вы отказываетесь, когда используете unsafePerformIO
. unsafePerformIO
говорит, что не имеет значения , скомпилировано ли выражение как одно выполнение newUnique
или два, и любая реализация Haskell может свободно выбирать то, что ей нравится, каждый раз, когда встречается с таким кодом .
Быстрый и простой способ заставить эту работу работать - добавить запись в файл хоста на MAC. Вы можете найти файл в / etc / hosts
Отредактируйте файл и добавьте запись в конце следующим образом:
<ip address> <hostname>
пример:
69.59.196.211 www.stackoverflow.com
Таким образом, Я бы пошел, и они упомянули об использовании файла хоста в опубликованной вами статье. Дополнительную информацию о редактировании файлов хоста на разных машинах можно найти здесь: