haskell - Haskell 的纯度是由类型系统或 IO 的实现强制执行的吗?

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

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

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

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

最佳答案

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

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

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

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

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

关于haskell - Haskell 的纯度是由类型系统或 IO 的实现强制执行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36019605/

相关文章:

haskell - haskell中的素数程序

algorithm - 我的 RSA 算法只适用于非常短的单词

python - 关于 Python 导入的一些困惑

android - Gradle 模块构建顺序

javascript - Webpack:未找到多模块中的错误

haskell - 是什么让 Haskell 的类型系统比其他语言的类型系统多 "powerful"?

scala - Scala 的路径依赖类型是什么意思?

haskell - 无法推断因使用 ‘>’ 而产生的 (Ord a0)

list - 使用 zipWith 计算列表元素的差异

haskell - 在Haskell中选择AST表示形式