如何在管道中使用导管下降功能?

2023-12-25

我有一个简单的任务 - 从文件中读取一堆行并对每一行执行一些操作。除了第一个 - 这是一些需要忽略的标题。

所以我想我应该尝试一下管道。

printFile src = runResourceT $ CB.sourceFile src =$= 
    CT.decode CT.utf8 =$= CT.lines =$= CL.mapM_ putStrLn

Cool.

所以现在我只想删除第一行......似乎有一个函数可以做到这一点 -

printFile src = runResourceT $ CB.sourceFile src =$= 
    CT.decode CT.utf8 =$= CT.lines =$= drop 1 =$= CL.mapM_ putStrLn

嗯 - 但现在我注意到 drop 有类型签名Sink a m ()。有人向我建议我可以使用 Monad 实例作为管道,并使用 drop 来有效地删除一些元素 - 所以我尝试了这个:

drop' :: Int -> Pipe a a m ()
drop' n = do
  CL.drop n
  x <- await
  case x of 
    Just v -> yield v
    Nothing -> return ()

它不会进行类型检查,因为管道的 monad 实例仅适用于相同类型的管道 - 接收器将 Void 作为其输出,所以我不能像这样使用它。

我快速浏览了 Pipes 和 Pipes-Core,发现 Pipes-Core 具有我预期的功能,其中 Pipes 是一个最小的库,但文档显示了它的实现方式。

所以我很困惑 - 也许我缺少一个关键概念..我看到了这个功能

sequence ::  Sink input m output -> Conduit input m output

但这似乎不是正确的想法,因为输出值为 ()

CL.sequence (CL.drop 1) :: Conduit a m ()    

我可能会回去使用lazy-io,因为我真的不需要任何流媒体 - 但我有兴趣了解正确的方法。


首先,简单回答一下:

... =$= CT.lines =$= (CL.drop 1 >> CL.mapM_ putStrLn)

更长的解释:实际上有两种不同的方法可以实现drop。不管怎样,它都会先掉落n来自输入的元素。关于它接下来要做什么有两种选择:

  • 说已经完成了
  • 开始输出输入流中的所有剩余项目

前一种行为是Sink将执行(以及我们的drop实际上是这样),而后者是Conduit。事实上,您可以通过单子组合从前者生成后者:

dropConduit n = CL.drop n >> CL.map id

然后你可以使用dropConduit正如你在开头所描述的。这是展示单子组合和融合之间差异的好方法;前者允许两个函数在同一输入流上运行,而后者允许一个函数将流提供给另一个函数。

我还没有进行基准测试,但我相当确定单子组合会更有效一些。

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

如何在管道中使用导管下降功能? 的相关文章

  • 为什么Haskell没有split函数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在许多语言中 都有一个函数可以使用指定的分隔符将字符串分成几部分 它经常被称为split 您可以在 Python C Java JavaScri
  • 在 win32/cygwin 上编译 haskell 模块网络

    我正在尝试编译 Network HTTP http hackage haskell org package network http hackage haskell org package network 在 win32 cygwin 上
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • 绑定变量时 Haskell 中的无限循环

    下面的 Haskell 代码不会终止 有人可以解释一下为什么吗 谢谢 f let x 10 in let x x x in x 我认为解释器首先绑定 x 10 然后将 x x 计算为 100 并绑定 x 100 环境变为 x 100 那么整
  • 在 Haskell 中对单位的组成(例如英寸、美元等)进行建模

    跟进自我之前的一个问题 https stackoverflow com q 73375273 222529 我问如何创建一个可以对单元进行建模的类型 例如Inch 作为 Haskell 中的一种类型 我现在面临的问题是如何对该单元和其他单元
  • 应用交换律

    带有效果的应用程序编程 http staff city ac uk ross papers Applicative html麦克布莱德和帕特森的论文提出了互换法 u lt gt pure x pure f gt f x lt gt u 为了
  • Haskell,范围缩小到无步骤[重复]

    这个问题在这里已经有答案了 为什么在 Haskell 中工作范围不能降低到没有步骤 7 1 gt 但只工作这个 7 6 1 gt 7 6 5 4 3 2 1 Haskell 无法知道您想要执行 1 除非您给出提示 在某些情况下 您可能需要一
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • 如何找到仅是 2、3 和 5 的幂的倍数的所有数字的列表? [复制]

    这个问题在这里已经有答案了 I am trying to generate a list of all multiples which can be represented by the form where a b and c are w
  • 将 Either 列表转换为其中包含列表的 Either 列表

    我是 Haskell 的初学者 我正在编写一些使用 Haskell 的代码Either https hackage haskell org package base 4 9 0 0 docs Data Either html用于错误处理 E
  • 我应该使用镜头中的什么来按索引构建只读吸气剂?

    我有一个内部细节被隐藏的类型 我想提供某种镜头 可以在特定索引处读取所述类型的元素 但是not修改它们 一个Ixed我的类型的实例似乎没有做我想要的事情 因为它明确允许修改 尽管不允许插入或删除 如果我想允许只读索引 我不确定我使用什么 如
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • Haskell 测量函数性能

    在 Haskell 中 我如何 简单地 测量函数的性能 例如 运行需要多长时间 或者需要多少内存 我知道分析 但是 是否有一种更简单的方法不需要我对代码进行太多更改 测量运行需要多长时间以及需要多少内存是两个独立的问题 即 基准测试和分析
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • 如何处理在组合下发生变化的类型?

    我最近读了一篇非常有趣的论文单调性类型 https infoscience epfl ch record 231867 files monotonicity types pdf其中描述了一种新的 HM 语言 该语言可以跟踪操作之间的单调性
  • Haskell 和 Idris 之间的区别:类型宇宙中运行时/编译时的反映

    因此 在 Idris 中 编写以下内容是完全有效的 item b Bool gt if b then Nat else List Nat item True 42 item False 1 2 3 cf https www youtube
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se

随机推荐

  • C# 中的锁定关键字

    我从MSDN上了解到lock关键字的主要作用 lock 语句 C 参考 lock 关键字标记一条语句 块作为关键部分 获取互斥锁 对于给定的对象 执行 声明 然后发布 锁 什么时候应该使用锁 例如 它对于多线程应用程序很有意义 因为它可以保
  • 如何在 C# 中使网页浏览器控件变为空白?

    最初 当网络浏览器刚刚加载到表单上时 它是空白的 即白色 一旦我们进入某个特定网站 有没有办法让它再次变成空白 我尝试过这些方法 但没有找到一种可以实现这一点的方法 还有其他方法还是我错过了什么 尝试一下 webBrowser1 Navig
  • 使用“”的不可重现的随机数

    我正在尝试创建一个类 为多个分布生成随机数 同时保持它们的可重复性 通过设置初始种子 该代码似乎有效 直到我开始使用正态分布和奇怪的错误表面 这些主要是 如果我取消注释double a rnd rnorm 0 0 1 0 line 第40行
  • 项目模板中的列表视图视觉状态管理器(WinRT、Metro、XAML)

    我正在尝试获取一个列表视图来显示由文本块组成的项目列表 当单击列表视图项目时 我想显示一个由文本框组成的列表 以下是我想出来的 它不起作用 我在模板中有两个网格 希望根据是否选择列表视图项来简单地显示和隐藏网格 我哪里出错了 我从列表视图的
  • Qt 3D 数组与 QVector 等 Qt-Objekts

    如何仅使用 Qt Objects 创建 3D 数组 该数组应该是 3D 整数数组 我尝试在堆上创建一个标准的 3D 数组 在堆上分配内存效果很好 如果我想释放内存 我会遇到错误 const int scalefaktor 16 int an
  • 为什么 IOS5 中不推荐使用 Accelerometer:didAccelerate: ?

    iOS5的发布就有这个核心功能列为已弃用 https developer apple com library prerelease ios documentation UIKit Reference UIAccelerometerDeleg
  • 以编程方式运行散景服务器以在本地浏览器中显示

    我正在进行交互式数据操作bokeh 0 12 6 我将在包中部署的实用程序 这个想法是用户可以运行一些例程module utility 这将启动散景服务器 在浏览器中启动应用程序 当选项卡或浏览器关闭时 服务器将停止 如果我运行 我的应用程
  • 如何在 Pentaho BI 服务器 v6 CE 上部署计划的 Kettle 作业

    我有一台运行 Pentaho BI 服务器 v6 社区版的服务器 我们开发了一项 Kettle 作业 用于从一个数据库提取到另一个数据库 并导出为 KJB 文件 我想每 12 个小时左右运行一次这项工作 我注意到BI服务器已经包含了Kett
  • 如何在没有互联网连接的情况下本地安装 NodeJS 项目?

    我有一个项目 必须将其部署到无法连接到互联网的客户端 Windows 系统 我目前在 D NODE 中有一个文件夹 其中包含 node exe 和 npm cmd 以及一个 node modules 文件夹 为了能够从命令行运行节点 我已将
  • .htaccess 文件的位置

    var www html My project folder 是我的项目的路径 我没有找到 htaccess 文件 我想粘贴我编辑的 htaccess 文件 但我不确定我需要放在哪个位置 我的 htaccess 文件代码是
  • Bash 脚本中的 SSH 搞乱了文件读取 [重复]

    这个问题在这里已经有答案了 我有一个脚本 可以逐行读取文件 并根据读取的内容执行操作 它所做的事情之一是通过 ssh 连接到远程服务器并获取一些信息 由于某种完全超出我能力范围的原因 这会停止从文件中读取行 该脚本本质上是 我已经删除了很多
  • 寻找Python字典中最大的键

    General 我需要帮助在 python 中找到一种方法来获得最大值N多维Python字典中的项目 例如 things car weight 100 apple weight 1 spanner weight 10 在这种情况下 我想找到
  • JavaFX WebView 进度始终从 0.0 到 1.0。 (无中间值)

    我目前正在使用 GluonHQ JavaFXPorts 开发一个应用程序 其中我使用 WebView 加载一些 Internet 页面 我注意到当我在桌面上使用以下代码时 webEngine getLoadWorker progressPr
  • undefined 不是一个对象(评估 'ImagePickerManager.showImagePicker')

    我正在尝试使用react native image picker 但卡在这里 它总是显示错误 如下图所示 undefined 不是一个对象 评估 ImagePickerManager showImagePicker 有人遇到过这个问题吗 我
  • 使用 Python 的函数返回值为 shell 变量赋值

    我有一个 Python 函数 fooPy 它返回一些值 整数 双精度或字符串 我想使用这个值并在 shell 脚本中分配它 例如以下是 python 函数 def fooPy return some string return 10 alt
  • 使用 API 通过 Nodejs 使用 Drive.files.copy 将 Word 文档转换为 Google 文档 在 Google Drive API v3 中进行转换

    我正在尝试通过 Node js 使用 API 将 Word 文档转换为 Google 文档 单词文档已经在一个文件夹中 我只想将它们转换为谷歌文档 我正在使用v3 The v3 docs https developers google co
  • PHP EOF 仅显示循环的一个结果

    我在 PHP 中使用 EOF 问题是它只显示来自 mySQL 循环的一项 它仅显示最后的结果 这在EOF中有必要吗 或者我可以避免这个问题吗 Thanks function getYiBAdminBanner global site glo
  • R try catch 块

    我正在尝试在循环中评估树的多个输出参数 但有时树功能会中止 这些行如何被 try catch 块包围 我很抱歉没有 真正的 代码 但我没有非工作树的示例 这是pseddo代码来说明当前的实现 for icol in seq 1 ncol c
  • 如何从纬度和经度找出地图瓦片坐标?

    我正在使用 Mapbox 矢量切片从后端进程收集特定数据 在示例中 他们提供了曼哈顿图块的链接 http a tiles mapbox com v3 examples map zr0njcqy 14 4823 6160 png http a
  • 如何在管道中使用导管下降功能?

    我有一个简单的任务 从文件中读取一堆行并对每一行执行一些操作 除了第一个 这是一些需要忽略的标题 所以我想我应该尝试一下管道 printFile src runResourceT CB sourceFile src CT decode CT