我最喜欢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 #-}.这也对重叠实例施加了一些温和的限制.
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |