2

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

基本上,如果类型构造函数可用,这样的事情是否可以完成?

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

2 回答 2

4

是的,这在某种意义上是对的。

类型系统本身不知道IO也不需要知道任何事情。不同的语言特性对用户隐藏了 IO 动作的真实表示,因此不可能“只运行”一个 IO 动作。

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

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

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

于 2016-03-15T18:58:04.753 回答
4

当然,导出低级原语可能会在任何地方产生副作用。而且,是的,只有避免出口每件危险的东西,你才能获得纯洁。不需要类型级别的机器。

然而,如果没有类型限制,所有与 IO 相关的东西都会很危险。所以我们将完全禁止 IO。不是很实用。

相反,在类型系统的帮助下,我们可以导出一些“危险”的 IO 操作,因为知道它们只能在“受控”的地方执行,这些地方必须IO在其类型中带有标签。使它们不再危险。

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

于 2016-03-15T19:09:27.453 回答