【问题标题】:Is Haskell's purity enforced by the type system or IO's implementation?Haskell 的纯度是由类型系统还是 IO 的实现来强制执行的?
【发布时间】:2016-03-15 18:46:04
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我们能对这种误解做些什么吗? (它甚至重要吗?)
  • 让我补充一两个想法,@BalinKingOfMoria
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多