Haskell的纯度是由类型系统还是IO的实现强制执行的?

时间:2016-03-15 18:46:05

标签: haskell module type-systems purely-functional io-monad

总是说Haskell的类型系统可以防止不纯的代码污染纯代码,因为你总是必须在类型签名中指定IO。但是,这是类型系统本身的结果,还是仅仅是IO(..)未导出?

基本上,如果类型构造函数可用,是不是可以这样做?

ioToPure :: IO a -> a
ioToPure (IO ioValue) = ioValue

2 个答案:

答案 0 :(得分:4)

是的,这在某种意义上是正确的。

类型系统本身并不知道有关IO的任何信息,也不需要。它是不同的语言功能,可以隐藏用户的IO操作的真实表示,因此无法“只运行”IO操作。

事实上,Haskell和类似语言中的IO安全性是多种语言特性和属性的综合结果,最突出的是:

  • 强大的类型系统,不接受用户“闭嘴,我知道更好”。
  • 输入所有内容的属性。我的意思是,在不纯的语言中,你有“语句”,即使类型系统很强大,它也不会超过下一个分号。在Haskell中,我们只有表达式,每个表达式的每个位都得到一个类型,并最终影响表达式所在函数的类型。
  • 隐藏类型表示的语言功能。

尽管如此,我认为“类型系统确保不纯净和纯粹的代码分离”这一表达是一种无害的简化。

答案 1 :(得分:4)

当然,导出低级原语可能会在任何地方产生副作用。 并且,是的,您可以通过避免导出每个危险的东西来获得的纯度。不需要任何类型级别的机器。

但是,没有类型限制,与IO相关的一切都是危险的。所以我们完全不允许IO。不太有用。

在类型系统的帮助下,我们可以导出一些"危险的" IO动作,知道它们只能在"受控制的"地点,必须在其类型中携带IO标记。让它们不再危险。

因此,纯度来自静态保证和谨慎出口的结合。