逃离monad IO

V. *_*ria 4 haskell

我最喜欢Haskell的一个方面是编译器如何通过函数签名中的IO monad来定位副作用.但是,通过导入2个GHC原语似乎很容易绕过这种类型的检查:

{-# LANGUAGE MagicHash #-}

import GHC.Magic(runRW#)
import GHC.Types(IO(..))

hiddenPrint :: ()
hiddenPrint = case putStrLn "Hello !" of
  IO sideEffect -> case runRW# sideEffect of
    _ -> ()
Run Code Online (Sandbox Code Playgroud)

hiddenPrint是单位类型,但它在调用时会触发副作用(它打印Hello).有没有办法禁止那些隐藏的IO(除了信任没有人导入GHC的原语)?

dfe*_*uer 10

这是Safe Haskell的目的.如果添加{-# language Safe #-}到源文件的顶部,则只允许导入推断安全或标记的模块{-# language Trustworthy #-}.这也对重叠实例施加了一些温和的限制.