У меня такое чувство, что я буду очень непопулярным, чтобы сказать то, что я собираюсь сказать, но почувствовал, что мне приходится отвечать на некоторые из (на мой взгляд, неверную) информацию, представленную здесь.
Хотя это правда, что небезопасныйPerformIO был официально добавлен к языку в качестве части дополнения FFI, причины этого в значительной степени исторические, а не логичные. Он существовал неофициально и широко использовался задолго до того, как у Haskell когда-либо был FFI. Это никогда не было официально частью основного стандарта Haskell, потому что, как вы заметили, это было просто слишком смущение. Наверное, надежда состояла в том, что в какой-то момент в будущем она просто исчезнет. Ну, этого не случилось, и не будет, на мой взгляд.
Разработка дополнения FFI послужила удобным предлогом для небезопасногоPerformIO, чтобы получить доступ к официальному языковому стандарту, поскольку, по-видимому, здесь это не слишком плохо, по сравнению с добавлением возможности вызова внешнего (IE C) кода (где все ставки отключены относительно статического обеспечения чистоты и безопасности типов в любом случае). Было также удобно добавить его здесь по политическим причинам. Это способствовало мифу о том, что Haskell будет чистым, если бы это было не для всех грязных «плохо спроектированных» C или «плохо спроектированных» операционных систем, или «плохо спроектированных» аппаратных средств или ... что угодно .. Конечно, верно, что unsafePerformIO регулярно используется с кодом, связанным с FFI, но причины этого часто связаны с плохим дизайном FFI и даже с самим Haskell, неплохим дизайном любого иностранного объекта, который Haskell также пытается использовать интерфейс.
Как утверждает Норман Рэмси, официальная позиция заключалась в том, что было нормально использовать unsafePerformIO при условии, что определенные обязательства по доказательству были удовлетворены тем, кто его использовал (в первую очередь это делает недействительными важные преобразования компилятора, такие как inline и common sub -выражение экспрессии). Пока что так хорошо, или так можно подумать. Реальный кикер состоит в том, что эти доказательные обязательства не могут быть удовлетворены тем, что, вероятно, является самым распространенным вариантом использования для небезопасногоPerformIO, который по моей оценке составляет более 50% всех небезопасныхPerformIO в дикой природе. Я говорю об ужасающей идиоме, известной как «небезопасный PerformIO-хак», который доказуемо (на самом деле, очевидно) совершенно небезопасный (при наличии inlining и cse).
У меня на самом деле нет времени, места или желания, чтобы понять, что такое «небезопасный PorformIO-хак» или почему он необходим в реальных библиотеках IO, но в итоге люди, которые работают с инфраструктурой IO Haskells, обычно «застрял между скалой и твердым местом». Они могут либо предоставить API с неотъемлемой безопасностью, который не имеет безопасной реализации (в Haskell), либо они могут обеспечить неотъемлемо небезопасный API, который можно безопасно реализовать, но то, что они редко могут сделать, это обеспечить безопасность как в дизайне API , так и в.Судя по удручающей регулярности, с которой «небезопасный PerformIO взломать» появляется в коде реального мира (включая стандартные библиотеки Haskell), кажется, что большинство выбирает прежний вариант как меньшее из двух зол и просто надеется, что компилятор не будет гадать вещи с inlining, cse или любые другие преобразования.
Желаю всего этого было не так. К сожалению, это так.
Что касается вашего редактирования: но по-прежнему можно создать функциональную библиотеку, которая может быть вызвана из императивной программы. В конечном счете, программист должен решить, насколько функциональна присутствует. –
Невозможно ввести нечистый код, это просто не по умолчанию. И язык идет на значительную длину, чтобы отговорить его. Тем не менее, нечистый код иногда полезен. Особенно, когда он безопасно скрыт за чистым интерфейсом. –
См. Также http://stackoverflow.com/questions/1916692/are-side-effects-possible-in-pure-functional-programming и http://stackoverflow.com/questions/1916692/are-side-effects-possible -in-pure-functional-programming и http: // stackoverflow.com/вопросы/2488646/why-are-side-effects-modeled-as-monads-in-haskell –