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

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 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 访问函数中的环境

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

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符
  • 如何从 haskell 中的 IOError 获取 errno?

    我在 haskell 平台上 GHC 6 12 1 作为 apt get 安装在 Debian Squeeze 上 鉴于我需要在与最初引发它的线程不同的线程上使用它 如何从 IOError 中获取底层 errno 我需要这个的原因是因为我正
  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • execlp 多个“程序”

    我想运行类似的东西 cat file tar base64 myprogram c base64 d tar zvt I use execlp运行该进程 当我尝试运行类似的东西时cat它有效 但如果我尝试运行base64 d tar zvt
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • 将 num 的签名键入 double?

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

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 这个对自身单位的列表理解是如何工作的?

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

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add

随机推荐

  • 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