Одна из вещей, которые мне больше всего нравятся в Haskell, заключается в том, как компилятор находит побочные эффекты через монады IO в сигнатурах функций. Тем не менее, кажется, легко обойти эту проверку типа, импортируя 2 GHC примитивы:Escaping monad IO
{-# LANGUAGE MagicHash #-}
import GHC.Magic(runRW#)
import GHC.Types(IO(..))
hiddenPrint ::()
hiddenPrint = case putStrLn "Hello !" of
IO sideEffect -> case runRW# sideEffect of
_ ->()
hiddenPrint
является единицы типа, но это не вызовет побочный эффект при вызове (печатает Hello). Есть ли способ запретить эти скрытые IO (кроме доверия никому не импортировать примитивы GHC)?
Я думаю, что полезность IO (и аналогичных функций безопасности) должна измеряться в «как легко заставить ее работать, если вы не хотите ее сломать», а не «как легко сломать ее, если вы хотите ее сломать» , –
Кроме того, импорт 'System.IO.Unsafe' и использование' unsafePerformIO' выглядит проще;). Легко обойти, но _unsafe_. – Zeta
'unsafeDupablePerformIO (IO m) = case runRW # m of (# _, a #) -> a' Это точно то же самое, я не знал этого модуля, хотя :) Я наткнулся на 'runRW #' при чтении упрощения ядро. –