总是说Haskell的类型系统可以防止不纯的代码污染纯代码,因为你总是必须在类型签名中指定IO
。但是,这是类型系统本身的结果,还是仅仅是IO(..)
未导出?
基本上,如果类型构造函数可用,是不是可以这样做?
ioToPure :: IO a -> a
ioToPure (IO ioValue) = ioValue
答案 0 :(得分:4)
是的,这在某种意义上是正确的。
类型系统本身并不知道有关IO
的任何信息,也不需要。它是不同的语言功能,可以隐藏用户的IO操作的真实表示,因此无法“只运行”IO操作。
事实上,Haskell和类似语言中的IO安全性是多种语言特性和属性的综合结果,最突出的是:
尽管如此,我认为“类型系统确保不纯净和纯粹的代码分离”这一表达是一种无害的简化。
答案 1 :(得分:4)
当然,导出低级原语可能会在任何地方产生副作用。 并且,是的,您可以通过避免导出每个危险的东西来获得仅的纯度。不需要任何类型级别的机器。
但是,没有类型限制,与IO相关的一切都是危险的。所以我们完全不允许IO。不太有用。
在类型系统的帮助下,我们可以导出一些"危险的" IO动作,知道它们只能在"受控制的"地点,必须在其类型中携带IO
标记。让它们不再危险。
因此,纯度来自静态保证和谨慎出口的结合。