人们总是说 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/