为什么我不能使用 seq 强制执行 IO 操作?

2023-11-23

鉴于此代码片段:

someFunction x = print x `seq` 1

main = do print (someFunction "test")

为什么不print x print test代码什么时候执行?

$./seq_test 
1

如果我把它替换为error我可以检查左操作数seq is确实评价过。

我怎样才能达到我的预期输出:

test
1

仅修改someFunction?


评估一个IO行动什么也不做。这是正确的!

If you like, values of IO type are merely "instruction lists". So all you do with that seq is force the program to be sure1 of what should be done if the action was actually used. And using an action has nothing to do with evaluation, it means monadically binding it to the main call. But since, as you say, someFunction is a function with a non-monadic signature, that can't happen here.

你可以做什么...但不要, is

import Foreign

someFunction x = unsafePerformIO (print x) `seq` 1

这实际上将评估与IO执行。这在 Haskell 中通常是一个非常糟糕的主意,因为评估可能以完全不可预见的顺序发生,可能与您想象的次数不同(因为编译器假设引用透明),以及其他混乱的场景。

正确的解决方案是将签名更改为单子:

someFunction :: Int -> IO Int
someFunction x = do
     print x
     return 1

main = do
     y <- someFunction "test"
     print y

1And as it happens, the program is as sure as possible anyway, even without seq. Any more details can only be obtained by executing the action.

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

为什么我不能使用 seq 强制执行 IO 操作? 的相关文章

  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • java中filewriter的flush和close函数之间的区别

    我需要知道Java中的flush和close函数之间的确切区别是什么 当在写入文件期间将数据转储到文件中时 请提供一个例子 flush just确保所有缓冲数据都写入磁盘 在这种情况下 更一般地说 通过您正在使用的任何 IO 通道刷新 之后
  • Python:数百万个小文件的读写速度缓慢

    结论 看来 HDF5 是适合我的目的的方法 基本上 HDF5 是一种用于存储和管理数据的数据模型 库和文件格式 并且旨在处理令人难以置信的大量数据 它有一个名为 python tables 的 Python 模块 链接在下面的答案中 HDF
  • java IO将一个文件复制到另一个文件

    我有两个 Java io File 对象 file1 和 file2 我想将 file1 的内容复制到 file2 有没有一种标准方法可以做到这一点 而无需我创建一个读取 file1 并写入 file2 的方法 不 没有内置方法可以做到这一
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 访问函数中的环境

    In main我可以读取我的配置文件 并将其提供为runReader somefunc myEnv正好 但somefunc不需要访问myEnv读者提供 链中的下一对也没有提供 需要 myEnv 中某些内容的函数是一个微小的叶函数 如何在不将
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • 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 但我想了解仅使用所用函数的签名
  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • 修饰符 async 对此项目无效

    这似乎并不是数百个具有相同错误的其他问题的重复 我把它们都看过了 发现它们是无关的 我正在制作一个小笔记应用程序 并尝试从目录中读取文件 按照 MSDN 示例 我有以下代码 但它给了我一个错误 错误 1 修饰符 async 对此无效 项目
  • “Eta减少”并不总是在Haskell中举行?

    我发现我可以说 LANGUAGE RankNTypes f1 forall b b gt b gt forall c c gt c f1 f id f HLint 告诉我我可以在这里做 Eta 减少 但是 f2 forall b b gt
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Haskell:Data.Numbers.Primes 库在哪里?

    我尝试导入 Data Numbers Primes import Data Numbers Primes 伦哈斯克尔给了我 5 hs 1 8 Could not find module Data Numbers Primes Use v t

随机推荐

  • 如何为运行时依赖添加Import-Package指令?

    我正在使用 Gradle 构建 OSGi jar 但在清单方面遇到了一些问题 这是我的构建脚本的摘录 apply plugin java apply plugin osgi jar baseName awesome manifest nam
  • 臃肿的 EXE 大小以及与 Qt/MingW 的不必要的依赖关系

    我试图弄清楚如何缩小在最新的 QT SDK 4 8 2 基于 mingw g 下编译的 EXE 文件的大小 我当时正在开发一个普通的 C 控制台应用程序 它有一个简单的循环 并且只有 includes iostream 当我注意到它生成的
  • NLog 使用 NLog.config 动态更改文件名

    如何使用 C 中的变量动态更改文件名 我的想法是创建一个日志文件 例如Log
  • Dataframe Apply 方法返回多个元素(系列)

    import pandas as pd 假设我有一个dataframe像这样 df pd DataFrame a range 4 b range 1 5 它看起来像这样 a b 0 0 1 1 1 2 2 2 3 3 3 4 以及一个将 X
  • 如何让 bc(1) 打印前导零?

    我在 Makefile 中执行类似以下操作 echo 0 1 0 1 bc 当然 在真实文件中 数字是动态的 它打印 2但我想打印它0 2 我想这样做而不诉诸于sed但我似乎找不到如何获得bc打印零 或者是bc只是无法做到这一点 您还可以使
  • 如何通过TCL分割字符串并存储在列表中

    有没有办法分割字符串并保存在列表中 如何拆分字符串并保存在两个列表中 例如 我有一个字符串 我用它分割了几个字符串 a 1 b 2 c 3 d 4 然后我想创建两个这样的列表 a b c d and 1 2 3 4 以下是简单的tcl代码
  • 比较图像以找出差异

    任务 我在装配线的末端安装了一个摄像头 捕获生产物品的图像 举例来说 我们 制作门票 上面有一些文字和图片 所以每 生成的票据被拍照并作为图像保存到磁盘 现在我 想要检查这些保存的图像是否存在异常 即比较 将它们转换为图像 模板 这可以 所
  • 在Matlab中使像素透明

    我已经在 matlab 中导入了图像 在显示它之前如何使图像的背景透明 例如 我在白色背景上有一个红色球 如何使图像的白色像素透明 以便只有红色球可见 白色像素透明 您需要确保图像以 png 格式保存 然后您可以使用 阿尔法 参数png 文
  • Kotlin 多平台:访问代码中的构建变量

    我正在开发一个 Kotlin 多平台项目 该项目是一个为 iOS 和 Android 应用程序提供功能的 SDK In our build gradle kts我们希望在 iOS 和 Android 之间的公共代码共享代码中访问几个变量 作
  • bash:rsync,选项作为变量

    我正在编写 bash 脚本 该脚本在某些部分将通过 ssh 同步文件 不幸的是 我面临着将 rsync 选项保持为变量的问题 请看下面 variables directory etc backupDirectory backup incre
  • 即使我没有对项目进行任何更改,为什么我的数据库项目的 .dbmdl 文件也会发生变化?

    我遇到了一个小而奇怪的烦恼 似乎也发生在其他人身上 例如 查看SEDE的修订历史 我在 Visual Studio 2010 中有一个可以正常工作的 SQL Server 2008 数据库项目 当我提交 签入源代码管理时 我被告知我的数据库
  • Symfony2:自定义错误页面扩展base.html.twig

    我正在尝试自定义 Symfony 中的错误页面 这是我的error html twig文件位于app Resources TwigBundle views Exception extends base html twig block bod
  • Google GCM 服务器返回未经授权的错误 401

    我正在使用 GCM 服务从服务器推送信息 如果我使用浏览器键 它会显示成功消息 multicast id 4849013215736515938 成功 1 失败 0 canonical ids 0 结果 message id 0 13487
  • 将 NULL 插入具有默认值的 NOT NULL 列

    对于一些背景知识 我们使用Zend 框架 2 and Doctrine在上班 教义总是会插入NULL对于我们自己不填充的价值观 通常这是可以的 因为如果该字段有默认值 那么它应该使用该默认值填充该字段 对于我们正在运行的服务器之一MySQL
  • Java 正则表达式中的零长度匹配

    我的代码 Pattern pattern Pattern compile a Matcher matcher pattern matcher ababa while matcher find System out println match
  • Microsoft.AspNetCore.All 元包的优缺点[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 In ASP NET Core 2 0无需包括个人package references in the csproj file Microsoft AspNetCore All元包包含所有必
  • 如何在 iOS 应用程序中列出所有 MFI 设备?

    我想显示所有通过 MFI 且之前未从 iOS 设置配对的苹果设备的列表 我可以使用以下代码列出已连接的设备 NSArray accessories EAAccessoryManager sharedAccessoryManager conn
  • Julia 中的奇怪分配

    考虑这个函数 function test function state M new number M state 1 new number end 在我的程序中 我想多次运行此函数 每次参数都是新的 有时由用户提供 为了测试这个函数的内存分
  • JavaFX:如何定位组件/节点?

    在JavaFX中 有类似的东西吗setLayout or setBounds 例如 我想将按钮放置到我想要的位置 JavaFX 场景图上的所有内容都是Node 每个节点都有一个 X 坐标和一个 Y 坐标 但有不同的方法set change
  • 为什么我不能使用 seq 强制执行 IO 操作?

    鉴于此代码片段 someFunction x print x seq 1 main do print someFunction test 为什么不print x print test代码什么时候执行 seq test 1 如果我把它替换为e