这是对Haskell IO的合理看法吗?
当给定程序时,Haskell运行时执行以下操作:
main
以取回“IO计算”这种两阶段方法允许main
保持纯粹的功能。
在这种情况下,IO计算就像Haskell的特殊版本,它具有明确的排序 - 或者可能有更好的方法来描述它?
答案 0 :(得分:12)
是的,这是程序执行方式的一个不错的语义模型。当然,实现并不像那样,但您仍然可以使用该模型来推断程序。
但更一般地说,IO
的作用是允许您将命令式程序视为纯值。然后Monad
操作允许您从较小的命令式程序(或使用此上下文中的常用术语, actions )和纯函数组成命令式程序。因此纯函数模型虽然不能执行命令式程序,但仍然可以将它们描述为IO a
类型的表达式,编译器可以将这些描述转换为命令式代码。
或者你可以这样说:
main
。即,模型的“evaluate main
”部分被推送到编译器,并且在您第一次描述时不在运行时中。
答案 1 :(得分:6)
您对IO
的看法很好,但我对此行有疑问
调用main以获取“IO计算”
考虑Haskell的最佳方式是函数不会做任何事情。相反,您以声明方式描述是的值。程序包含名为IO
的{{1}}值的说明。它“称为主要”的唯一意义是main
的声明被简化为弱头范式(或类似的东西)。
main
是任意副作用 - 完全计算的类型。 Haskell的纯子集是对值的纯粹声明性描述,恰好允许不可判定的描述。将Haskell想象为集合论等数学语言。集合论中的陈述不会做任何事情,但它们可能涉及复杂的计算,如“包含Akerman's_function(30)的最小集合”。它们还可以包含不可判断的语句,例如“S =不包含自身的所有集合的集合”
@amindfv是对的:IO
不是“纯函数”。它根本不是一个功能。它是一个值,由纯粹的缩减定义,编码不合理的计算。