Haskell do 块中如何允许表达式

2023-12-04

在以下代码的第 4 行中,我在 do 块中的两个 IO 操作之间夹有一个表达式:

  1 doubleX :: (Show x, Num x) => x -> IO ()                                                                                                                                                                                          
  2 doubleX x = do                                                                                                                                                                                                                    
  3   putStrLn ("I will now double " ++ (show x))                                                                                                                                                                                     
  4   let double = x * 2                                                                                                                                                                                                              
  5   putStrLn ("The result is " ++ (show double))

我将 do 表示法理解为使用 >>= 或 >> 将单子操作链接在一起。但是当你有一个介于两者之间的表达式时,它是如何工作的呢?您不能仅使用 >> 将第 3-5 行粘合在一起。


我将从我非常相似的答案中抄袭here(尽管可能不是重复的,因为该问题没有明确处理let).

The Report给出了从 do 语法到 Haskell 内核的完整翻译;与您的问题相关的部分是:

do {e}                = e
do {e;stmts}          = e >> do {stmts}
do {let decls; stmts} = let decls in do {stmts}

所以你的代码脱糖如下:

doubleX x = do                                                                                                                                                                                                                    
  putStrLn ("I will now double " ++ (show x))                                                                                                                                                                                     
  let double = x * 2                                                                                                                                                                                                              
  putStrLn ("The result is " ++ (show double))

==> do {e;stmts} rule

doubleX x =
  putStrLn ("I will now double " ++ (show x)) >> do
  let double = x * 2                                                                                                                                                                                                              
  putStrLn ("The result is " ++ (show double))

==> do {let decls; stmts} rule

doubleX x =
  putStrLn ("I will now double " ++ (show x)) >>
  let double = x * 2 in do
  putStrLn ("The result is " ++ (show double))

==> do {e} rule

doubleX x =
  putStrLn ("I will now double " ++ (show x)) >>
  let double = x * 2 in
  putStrLn ("The result is " ++ (show double))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell do 块中如何允许表达式 的相关文章

  • 如何为强制长度为 2^n 的向量类型定义可用的 Applicative 实例

    对于某些应用程序 我需要长度为 2 n 的向量 为了强制某些操作的长度匹配 我使用 ist 应用实例定义了我的类型 如下所示 LANGUAGE GADTs DataKinds FlexibleInstances FlexibleContex
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 编译成 C/C++ 源代码的编程语言? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么在 where 子句中使用类型签名如此罕见?

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

随机推荐

  • Javascript 焦点和选择在 FF 中不起作用

    使用jQuery 以下在FF中不起作用 但在IE中有效 this focus select 我环顾四周 发现你可以使用超时来解决这个问题 但如果我可以避免的话 这不是我想做的事情 有谁知道另一种方法来做到这一点并让它在 FF 中工作 都会
  • SQL Server 跟踪日期变化时的计划班次

    我什至不知道从哪里开始解决这个问题 我需要从我们的 MS SQL 2012 数据库查询生产数据 该数据库具有基于记录的班次的日期时间戳 棘手的部分是我们运行 4 个 12 小时班次采用 2 开 2 关 3 开 2 关的模式 即 2013 年
  • 如何绘制立方体的面?

    我已经做了一个可以在 python 上旋转的立方体 但现在我想为这些面着色 以便在旋转时识别每个面 代码如下 from mpl toolkits mplot3d import Axes3D import matplotlib pyplot
  • 如何使用 Tesseract 对图像进行 OCR

    我开始学习 OpenCV 和 Tesseract 并且在一个看似非常简单的示例上遇到了麻烦 这是我尝试 OCR 的图像 内容为 171 m 我做了一些预处理 由于蓝色是文本的主色 因此我提取蓝色通道并应用简单的阈值处理 img cv2 im
  • 执行Excel4Macro从关闭的工作簿中获取范围/图表

    我使用这些行从关闭的工作簿中获取值 Arg Path File Sheet R4C4 Arg CStr Arg GetValue ExecuteExcel4Macro Arg 除了循环之外还有其他方法从范围中获取值吗 循环解决方案正在工作
  • JavaScript 原型不工作

    嗨 我不知道这是否是我理解 Javascript 原型对象的错误 需要明确的是 我对 Javascript 单例概念很陌生 并且缺乏明确的知识 但是通过一些推荐网站 我为我的系统制作了示例代码 但它给出了一些错误 我找不到原因 所以我 我请
  • Android 创建位图时出现 OutOfMemory 错误

    我收到错误java lang OutOfMemoryError bitmap size exceeds VM budget 当为了手动绘制折线图而创建位图时会发生这种情况 width display getWidth 10 height w
  • Jenkins 日志变得巨大并填满了整个磁盘空间

    每周我都会惊讶地发现我的 Jenkins 服务器达到了 Jenkins 日志使用的 100 磁盘 所以我删除了该文件 然后我的磁盘再次获得大量可用空间 ec2 user ip xxx xxx xxx xxx df h Filesystem
  • 如何将环境设置导入到我的 Perl 程序中?

    我有一个脚本 其内容只是导出 Linux 中的一个变量 export LD LIBRARY PATH 我想在我的 Perl 脚本中运行这个脚本 这样无论是谁运行我的 Perl 脚本都会有他们的LD LIBRARY PATH放 我可以在 Pe
  • 初级ILNumerics:VS2012下安装

    我对 ILNUmerics 非常感兴趣 想尝试免费版本 但我遇到了麻烦 我已经从控制台应用程序开始 并尝试运行 hello ilnumerics 控制台应用程序 但我注意到 VS 无法找到 MKL 库 我在 Windwos 8 下使用 VS
  • Azure函数应用程序使用slf4j登录App Insights

    使用 Spring Cloud Functions 实现了 Azure Function App 在应用程序设置 APPINSIGHTS INSTRUMENTATIONKEY 中配置的 App Insights 检测密钥 我使用 lombo
  • react-native fetch - 请求正文 - 意外的 EOF

    在我的反应本机应用程序中 我尝试使用以下命令发出获取请求body 但是 我收到错误消息unexpected EOF 实际上 请求已发出 我的意思是我可以通过后端日志看到请求已发送 而在请求之后 它立即显示错误消息 这是我的fetch met
  • python: += s, 中的逗号有什么作用?

    我正在做一个问题 输入是字符串 abc bcd acef xyz az ba a z 代码如下所示 def groupStrings self strings groups collections defaultdict list for
  • 如何获取res文件夹的Uri?

    我正在尝试获取可绘制文件夹中图像的 Uri 我尝试了很多可能的方法 但似乎没有任何效果 谁能建议我如何获取 res 文件夹的 Uri 任何帮助深表感谢 嗯 实际上很容易 包中资源的基本 URI 类似于以下可能性 android resour
  • 如何为 iphone 5 设置 apple-touch-startup-image?

    I tried 但这没有用 苹果的界面指南还没有针对 iPhone 5 进行更新 有谁知道吗 谢谢 1 视口不要使用 width device width 使用以下代码
  • SSO - 未找到 OpenID 端点

    我正在尝试让 SSO openid 与 dotnetopenauth 一起使用 我有两个单独的项目 分别进行调试 都在本地主机上 但有两个不同的端口 一个充当提供者 一个充当依赖方 依赖方正在运行localhost 1903 提供者正在运行
  • 无效的 Git RSA 密钥指纹

    我开始收到这个错误 Received disconnect from 192 30 253 112 port 22 2 Connection blocked because server only allows public key aut
  • 如何在 Visual Studio 或其他构建工具的一个 C# 项目中生成 dll 和 exe 的混合?

    如何在 Visual Studio 或其他构建工具的一个 C 项目中生成 dll 和 exe 的混合 技术上可行吗 是的 我知道它可以在 2 个或更多项目中完成 我不确定你的问题的动机是什么 因为你可以引用 Net 可执行文件 就好像它是
  • 从 MySQL 中的同一(随机)记录中选择 2 列的最快方法是什么?

    我希望从同一条记录中随机检索一对列 不过 我听说 Rand 效率很低 所以我想使用不同的方式 很多文章都这么说 包括http akinas com pages en blog mysql random row 是的 我的标题几乎说明了一切
  • Haskell do 块中如何允许表达式

    在以下代码的第 4 行中 我在 do 块中的两个 IO 操作之间夹有一个表达式 1 doubleX Show x Num x gt x gt IO 2 doubleX x do