Haskell中的IO类型是什么

2023-12-30

我是 Haskell 编程语言的新手,我一直在绊倒IOtype 作为函数参数或返回类型。

playGame :: Screen -> IO ()

OR

gameRunner :: IO String -> (String -> IO ()) -> Screen -> IO ()

这是如何工作的,我有点困惑,因为我知道 String 需要单词而 Int 需要数字。什么是IO在函数中使用expect或Return?


IO这是 Haskell 区分引用透明代码和非引用透明代码的方式。IO a是返回一个 IO 操作的类型a.

您可以将 IO 操作视为一段等待执行的对现实世界有影响的代码。由于这种副作用,IO 操作不是引用透明的;因此,执行顺序很重要。这是mainHaskell 程序的功能是正确排序和执行所有 IO 操作。因此,当你编写一个返回的函数时IO a,您实际上正在做的是编写一个函数,该函数最终返回一个操作 - 当执行时main- 执行操作并返回a.

更多解释:

引用透明度意味着您可以用函数的值来替换函数。引用透明函数不能有任何副作用;特别是,引用透明函数无法访问任何硬件资源,例如文件、网络或键盘,因为函数值将取决于其参数之外的其他内容。

像 Haskell 这样的函数式语言中的引用透明函数就像数学函数(域和余域之间的映射),而不仅仅是一系列关于如何计算函数值的命令式指令。因此,Haskell 代码告诉编译器一个函数是applied其参数,但它并没有说函数是called从而实际计算出来。

因此,引用透明函数并不意味着执行顺序。 Haskell 编译器可以自由地以任何它认为合适的方式评估函数 - 或者如果没有必要则根本不评估它们(称为惰性评估)。唯一的顺序来自数据依赖性,当一个函数需要另一个函数的输出作为输入时。

现实世界的副作用并不是参照透明的。您可以将现实世界视为某种有效函数发生变异的隐式全局状态。由于这种状态,执行顺序很重要:如果您首先从数据库读取然后更新它,或者反之亦然,则会有所不同。

Haskell 是一种纯函数式语言,它的所有函数都是引用透明的,编译也依赖于此保证。那么,我们如何处理操纵某些全局现实世界状态并且需要按一定顺序执行的有效函数呢?通过在这些函数之间引入数据依赖性。

这正是 IO 所做的:在底层,IO 类型将有效函数与虚拟状态参数包装在一起。每个 IO 操作都将此虚拟状态作为输入并将其提供为输出。将此虚拟状态参数从一个 IO 操作传递到下一个 IO 操作会创建数据依赖性,从而告诉 Haskell 编译器如何正确排序所有 IO 操作。

您看不到虚拟状态参数,因为它隐藏在一些语法糖后面:do中的符号main和其他 IO 操作,以及内部IO type.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell中的IO类型是什么 的相关文章

  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 搜索重写规则

    有什么办法可以浏览或搜索重写规则吗 当我使用像这样的标志时 ddump rule firings or ddump rule rewrites我只是得到了触发的规则的名称以及它引起的重写 但没有得到实际的规则本身 理想情况下 我想通过 GH
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 约束包如何工作?

    背后的想法数据 约束 Forall http hackage haskell org packages archive constraints 0 3 2 doc html src Data Constraint Forall html据我
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 为什么在 where 子句中使用类型签名如此罕见?

    它是否有助于编译器优化 或者只是添加额外类型签名的多余工作 例如 人们经常看到 foo a gt b foo x bar x where bar x undefined 而不是 foo a gt b foo x bar x where ba
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 如何使用foldr为列表创建显示实例?

    我想为我的数据类型 我的列表 编写自己的显示实例 到目前为止 我的方法是有效的 但我总是在末尾有一个逗号 我已经尝试用最后一个元素启动折叠并将其从列表中删除 但它很麻烦而且不起作用 有没有更简单的方法来获得正确的解决方案 实际 1 2 3

随机推荐

  • 如何使用 Spring Security 和 SSL 忽略某些路径?

    这是我的 Spring 配置 import org springframework context annotation Bean import org springframework context annotation Configur
  • 数量、大小、长度……Ruby 中的选择太多?

    我似乎无法找到一个明确的答案 我想确保我理解这一点到 第n级 a a gt Hello b gt World a count 2 a size 2 a length 2 a 10 20 a count 2 a size 2 a length
  • 为什么 ReSharper 认为“thread.Name == null”总是 false? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在编写
  • “模块”对象没有属性“feature_column”

    我运行了谷歌的官方教程 链接在这里 https cloud google com ml engine docs how tos getting started training prediction 它在本地运行良好 但我陷入了需要在 Go
  • 如何在 Windows Phone 8 中使用对象进行导航?

    我需要使用对象而不是字符串从一个 xaml 页面导航到另一个页面 目前的代码是 private void Border ManipulationStarted object sender System Windows Input Manip
  • 为 NSIS 安装程序设置 UAC“发布者”字段

    当我打开安装程序 使用 NSIS 创建的 时 会出现 UAC 对话框 其中包含有关我的安装程序的信息 场出版商是 未知 我听说过对应用程序进行数字签名 您知道如何在 NSIS 中执行此操作吗 如何设置字段 属性出版商到 我的安装程序 或其他
  • Phonegap-Javascript发送跨域ajax请求

    我正在使用 PhoneGap 和 JavaScript 来生成 iPhone 应用程序 是否可以发送跨域 AJAX POST 请求并将响应下载为 HTML 例如 登录雅虎邮箱并获取新邮件 Cordova PhoneGap 允许白名单 htt
  • 在 Apache Solr 中对文件夹及其子文件夹中包含的所有文件进行索引

    Apache Solr 是否可以用于索引文件夹 父文件夹 及其子文件夹的所有文件 包含所有类型的文件 XML json pdf doc 等 使用post工具就可以完成 java Dc test Drecursive Dauto jar po
  • 将函数名称作为参数传递给另一个函数

    我正在 aspx 页面上从客户端调用 Web 服务 并且我想在该服务成功时调用一个函数 函数的名称将作为参数传递给该函数 该名称会动态更改 我是这样传递的 function funName parm1 parm2 onSucceedCall
  • 反射 java.lang.ClassNotFoundException

    我正在使用以下内容 protected void onActivityResult int requestCode int resultCode Intent data super onActivityResult requestCode
  • 使用 numpy 进行多元多项式回归

    我有很多样品 y i a i b i c i where y假定作为多项式变化a b c达到一定程度 例如 对于给定的一组数据和 2 度 我可能会生成模型 y a 2 2ab 3cb c 2 5ac 这可以使用最小二乘法来完成 并且是 nu
  • Java 中忽略 SSL 验证

    我必须使用无效的 SSL 证书调用 Web 服务器上托管的 HTTP 服务 在开发中 我正在导入证书keytool但每个客户端安装的证书都会不同 所以我不能只是捆绑它 前言 我DO要知道跳过 SSL 验证确实很难看 在这种特定情况下 我什至
  • 在 h2 数据库上创建视图

    我正在尝试在 H2SQL 上创建视图 但找不到正确的语法 我在用着 CREATE VIEW dbo Log AS SELECT FROM dbo MyTable 我收到错误 Caused by org h2 jdbc JdbcSQLExce
  • 将 var 初始化为 null

    我已经看到如何初始化var 为空 https stackoverflow com questions 2904689 how to initialize var这对我的情况没有帮助 我有 string nuller null var fir
  • 如何解决python pdfkit中的“wkhtmltopdf报告错误:由于网络错误而退出并显示代码1:ProtocolUnknownError”

    我正在使用姜戈 这是views py 中的代码 def download as pdf view request doc type pk import pdfkit file name invoice pdf pdf path os pat
  • Terraform timestamp() 为仅数字字符串

    The timestamp https www terraform io docs configuration interpolation html timestamp插值语法中的函数将返回 ISO 8601 格式的字符串 如下所示2019
  • py2exe com dll问题

    我正在尝试用 python 制作一个 com dll 但我尝试注册到编译的 dll 时出现错误消息 运行时错误 r6034 和 无法加载 python dll 这个问题的解决方案是什么 mycode 设置 py This is the di
  • 检测受密码保护的word文件

    我正在使用 netoffice 库从 Word 文件中提取文本 这应该是自动化过程 但是 当Word文件受密码保护时 会显示警报窗口 因此用户需要输入密码 由于这是自动化过程 用户无需输入密码 程序将在此停止 如何检测单词文件是否受 net
  • orderBy后Angularjs错误$index

    我是 Angular js 的新手 在对数组进行排序和处理排序后的数据时遇到一些问题 我有一个包含项目的列表 并希望按 Store storeName 对其进行排序 该列表到目前为止正在运行 但在对数据进行排序后 我的删除功能不再起作用 我
  • Haskell中的IO类型是什么

    我是 Haskell 编程语言的新手 我一直在绊倒IOtype 作为函数参数或返回类型 playGame Screen gt IO OR gameRunner IO String gt String gt IO gt Screen gt I