如何在 Haskell 中编写 Ctrl-C 处理程序?

2024-02-21

我尝试了以下方法:

import System.Exit
import System.Posix.Signals
import Control.Concurrent (threadDelay)

main :: IO ()
main = do
  installHandler keyboardSignal (Catch (do exitSuccess)) Nothing
  threadDelay (1000000000)

但它只输出:

^CTest.hs: ExitSuccess

on Ctrl-C,而不是退出。我应该怎样做才正确呢?


从文档installHandler:

安装了一个处理程序,该处理程序将在收到信号时(或之后不久)调用新线程中的操作。

and exitWith:

注意:在 GHC 中,应该从主程序线程调用 exitWith 才能退出进程。当从另一个线程调用时,exitWith 将像平常一样抛出 ExitException,但该异常不会导致进程本身退出。

So an exitSuccess处理程序不会结束进程,这是预期的(尽管是意外的;)行为。

如果您想立即采取行动,

import System.Exit
import System.Posix.Signals
import Control.Concurrent

main :: IO ()
main = do
  tid <- myThreadId
  installHandler keyboardSignal (Catch (killThread tid)) Nothing
  threadDelay (1000000000)

收到信号后立即终止线程。

如果你想成功退出,就不那么激烈了

import System.Exit
import System.Posix.Signals
import Control.Concurrent
import qualified Control.Exception as E

main :: IO ()
main = do
  tid <- myThreadId
  installHandler keyboardSignal (Catch (E.throwTo tid ExitSuccess)) Nothing
  threadDelay (10000000)

我认为它也会可靠地工作,但我不完全确定。

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

如何在 Haskell 中编写 Ctrl-C 处理程序? 的相关文章

  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • 有可能吗?:行为 t [行为 t a] -> 行为 t [a]

    有没有办法有一个Behavior t a 其中 a 在时间 t 的值是 a 中包含的值Behavior t Behavior t a 在时间 t 即 具有以下类型的函数 Behavior t Behavior t a gt Behavior
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?

    我有年 月 日 小时和分钟值 所有这些都是类型Int 我怎样才能将它们转换为UTCTime or UniversalTime 需要导入以下内容 import Control Lens import Data Thyme Clock impo
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • Windows 中的信号处理

    在Windows中 我试图创建一个等待SIGINT信号的python进程 当它收到SIGINT时 我希望它只打印一条消息并等待SIGINT的另一次出现 所以我使用了信号处理程序 这是我的 signal receiver py 代码 impo
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 如何手动推断表达式的类型

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

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

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 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 假设我

随机推荐

  • PHP 5.2.17 的 round() 模式 ROUND_HALF_DOWN

    我需要在 PHP 5 2 17 中模拟 ROUND HALF DOWN 模式 我无法升级服务器的 PHP 版本 有什么想法如何实现这一目标 基本思想是 1 895 变成 1 89 而不是像通常使用 round 那样变成 1 90 编辑 这个
  • ILMerge - 命令退出,代码为 255

    我正在尝试使用 ILMerge 将 DLL 嵌入到单个可执行文件中 我在构建事件 gt 构建后事件命令行中添加了此命令行 C Program Files Microsoft ILMerge ILMerge exe out TargetDir
  • 模型输入必须来自“tf.keras.Input”...,它们不能是先前非输入层的输出

    我正在使用Python 3 7 7 和张量流 2 1 0 我有一个预先训练过的 U Net 网络 我想要得到它的编码器 and 它的解码器 如下图所示 您可以看到卷积编码器 解码器架构 我想要获取编码器部分 即出现在图像左侧的图层 以及解码
  • ASMX Web 服务公开类

    我正在使用简单的 ASMX 服务在 asp net c 中创建基本的 Web 服务 当我创建返回类的方法时 服务的客户端可以发现该类定义 我想知道是否有一种方法可以将类公开给不直接在任何服务方法中使用的服务 我需要我的服务客户端了解特定的类
  • 在javascript刷新中调用php函数

    我在 javascript 中有一个简单的函数 可以在设定的时间后刷新页面 function AutoRefresh t setTimeout location reload true t 现在每次刷新后 我希望它调用 PHP 函数 例如
  • 如何从列表中发出每个项目之间有延迟的项目?

    我想从列表中发出项目 并且在每次发射之间我想要一个延迟 我试过这个 final Subscription subscription Observable from listOfItems delay 2000 TimeUnit MILLIS
  • Eclipse 和 Maven 多模块项目的问题

    我创建了一个 Maven 项目 其结构如下 root project pom xml pom sub projectA jar sub projectB jar 我已完成以下步骤 mvn 原型 创建 DgroupId my group id
  • 如何在sql选择中隐藏不同的列

    我正在 sql 中执行查询以查找具有不同值的行name如下 select distinct name age sex from person 它有效 但我不想在结果集中显示名称列 有没有办法隐藏此栏 EDIT1我说的原因distinct n
  • 有效地将线段排序成循环

    我正在使用一个图书馆 JavaScript Voronoi https github com gorhill Javascript Voronoi 它生成表示闭合多边形的线段数组 这些线段显示无序 无论是线段出现的顺序还是线段每端点的顺序
  • 如何获取动态创建的textview的id?

    我正在尝试为我正在制作的 Android 应用程序动态添加和删除 TextView 但我遇到了设置和获取 TextView id 的困难 我似乎在最后两行代码 et setText 和 ll removeView 中遇到了空指针异常 有人对
  • r 中的翻译(重新编码)错误

    这是一个小例子 X1 lt c AC AC AC CA TA AT CC CC X2 lt c AC AC AC CA AT CA AC TC X3 lt c AC AC AC AC AA AT CC CA mydf1 lt data fr
  • 具有复杂数据输入字段的 ASP.NET MVC UpdateModel

    我如何使用 ASP NET MVC UpdateModel 执行以下操作 我正在尝试将空格分隔的文本框数据 与新的 StackOverflow 问题中的 TAGS 文本框完全相同 例如这个 读入模型中 eg
  • 如何在 Julia 1.0 中进行记忆化或记忆化

    我一直在尝试用 Julia 来记忆斐波那契函数 这就是我想出来的 原始未修改的代码 用于控制目的 function fib x if x lt 3 return 1 else return fib x 2 fib x 1 end end 这
  • 当我到达页面顶部时,如何启动 JavaScript 或 jQuery 事件?

    我有一个简单的问题 但我找不到解决方案 我只想在向上滚动页面并 触摸 其顶部时启动一个事件 执行一个方法 我在我的页面中使用 JavaScript 和 jQuery 提前致谢 您应该为此目的使用滚动事件 window scroll func
  • 将文本环绕在右侧浮动列周围,其中左侧列首先出现在 html 中

    h1 tab1 tab2 tab3 text text photo text text photo text text photo text text photo text text photo text text text text te
  • JT400.jar 禁用登录屏幕

    谁能帮我吗 我有一个小型实用程序应用程序 它使用 Jt400 6 7 jar 连接到 AS400 服务器 请看下面的代码 private Connection buildConnection String url String userNa
  • 为什么我的代码只写最后一行?

    我正在向文件写入一个列表 但它只写入最后一行 这是我的代码 我使用的是Python 2 7 server os listdir contents of the current directory for files in server pu
  • 如何将 C# 哈希字节数组转换为字符串以传递给 API?

    我有许多值必须组合成 SHA256 哈希才能传递到 Web 服务 使用 Encoding ASCII GetBytes allparametershere 将这些值组合成字节数组 然后通过 myHashMethod ComputeHash
  • sql左连接返回

    我正在尝试在 2 个表上运行左连接 我没有分组依据 我唯一的条件是在第二张桌子上 但是 返回的行数少于第一个表 左连接不是应该从第一个表中获取所有数据吗 这是我的 SQL select from tbl a A left join tbl
  • 如何在 Haskell 中编写 Ctrl-C 处理程序?

    我尝试了以下方法 import System Exit import System Posix Signals import Control Concurrent threadDelay main IO main do installHan