这是对Haskell IO的合理看法吗?

时间:2012-02-23 23:47:05

标签: haskell monads

这是对Haskell IO的合理看法吗?

当给定程序时,Haskell运行时执行以下操作:

  1. 致电main以取回“IO计算”
  2. 然后执行或“运行”该计算,从而执行计算所包含的所有副作用。
  3. 这种两阶段方法允许main保持纯粹的功能。

    在这种情况下,IO计算就像Haskell的特殊版本,它具有明确的排序 - 或者可能有更好的方法来描述它?

2 个答案:

答案 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不是“纯函数”。它根本不是一个功能。它是一个值,由纯粹的缩减定义,编码不合理的计算。