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

Eri*_*ikR 7 monads haskell

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

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

  1. 调用main返回"IO计算"
  2. 然后它执行或"运行"该计算,从而执行计算所包含的所有副作用.

这种两阶段方法允许main保持纯粹的功能.

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

Lui*_*las 12

是的,这是程序执行方式的一个不错的语义模型.当然,实现并不像那样,但您仍然可以使用该模型来推断程序.

但更一般地说,是什么IO让你将命令式程序视为纯粹的价值观.然后,Monad操作允许您从较小的命令式程序(或使用此上下文中的常用术语,操作)和纯函数组成命令式程序.因此纯函数模型虽然不能执行命令式程序,但仍然可以它们描述为类型的表达式,IO a编译器可以将这些描述转换为命令式代码.

或者你可以这样说:

  • 编译器(不运行时)计算main.
  • 评估的结果是一项必要的计划.
  • 该程序保存到目标可执行文件.
  • 然后执行目标程序.

即,模型的"评估main"部分被推送到编译器,并且在您第一次描述时不在运行时中.

  • 我同意你的看法,并认为你的答案相当不错.虽然,至少对于没有必要背景的人来说,我认为纯语言方法可以成为教授这些东西的合适方式.事实上,有一段时间我一直在为一个只有数学背景的人写一本关于计算机体系结构的教科书.从lambda演算,函数式编程和一些小代数(类别,monad等)开始,我们将得到逻辑门,简单电路,RISC计算机,编译器和基本操作系统. (2认同)
  • 我不相信"编译器评估主要"; 例如表达式`if elem 10000000 [1 ..]然后getLine其他putStrLn"hello"`和`getLine`评估相同的东西,但是`main = if elem 10000000 [1 ..]然后getLine else putStrLn"hello" `和`main = getLine`最有可能导致不同的可执行文件.如果编译器真的评估了"main",那就不是真的了. (2认同)

Phi*_* JF 6

你的观点IO很好,但我对这一行有疑问

调用main来获取"IO计算"

考虑Haskell的最佳方式是函数不做任何事情.相反,您以声明方式描述值什么.程序包含对IO所调用值的描述main.它"称为主要"的唯一意义是声明main被简化为弱头范式(或类似的东西).

IO是任意副作用 - 完全计算的类型.Haskell的纯子集是对值的纯粹声明性描述,恰好允许不可判定的描述.将Haskell想象为集合论等数学语言.集合论中的陈述不做任何事情,但它们可能涉及复杂的计算,如"包含Akerman's_function(30)的最小集合".它们还可以包含不可判定的语句,例如"S =不包含自身的所有集合的集合"

@amindfv是对的一半:main不是"纯粹的功能".它根本不是一个功能.它是一个值,由纯粹的缩减定义,编码不合理的计算.