人们总是说 Haskell 的类型系统可以防止不纯代码污染纯代码,因为您总是必须IO
在类型签名中指定。但是,这是类型系统本身的结果,还是真的只是IO(..)
没有导出?
基本上,如果类型构造函数可用,这样的事情是否可以完成?
ioToPure :: IO a -> a
ioToPure (IO ioValue) = ioValue
人们总是说 Haskell 的类型系统可以防止不纯代码污染纯代码,因为您总是必须IO
在类型签名中指定。但是,这是类型系统本身的结果,还是真的只是IO(..)
没有导出?
基本上,如果类型构造函数可用,这样的事情是否可以完成?
ioToPure :: IO a -> a
ioToPure (IO ioValue) = ioValue
是的,这在某种意义上是对的。
类型系统本身不知道IO
也不需要知道任何事情。不同的语言特性对用户隐藏了 IO 动作的真实表示,因此不可能“只运行”一个 IO 动作。
因此,事实是,Haskell 和类似语言中的 IO 安全性是多种语言特性和属性的综合结果,最突出的是:
尽管如此,我认为“类型系统确保将不纯代码和纯代码分开”的表述是一种无害的简化。
当然,导出低级原语可能会在任何地方产生副作用。而且,是的,只有避免出口每件危险的东西,你才能获得纯洁。不需要类型级别的机器。
然而,如果没有类型限制,所有与 IO 相关的东西都会很危险。所以我们将完全禁止 IO。不是很实用。
相反,在类型系统的帮助下,我们可以导出一些“危险”的 IO 操作,因为知道它们只能在“受控”的地方执行,这些地方必须IO
在其类型中带有标签。使它们不再危险。
因此,纯度来自静态保证和谨慎导出的组合。