如何在 Haskell 中实现“cat”?

2023-11-23

我正在尝试写一个简单的catHaskell 中的程序。我想将多个文件名作为参数,并将每个文件依次写入STDOUT,但我的程序只打印一个文件并退出。

我需要做什么才能让我的代码打印每个文件,而不仅仅是传入的第一个文件?

import Control.Monad as Monad
import System.Exit
import System.IO as IO
import System.Environment as Env

main :: IO ()
main = do
    -- Get the command line arguments
    args <- Env.getArgs

    -- If we have arguments, read them as files and output them
    if (length args > 0) then catFileArray args

    -- Otherwise, output stdin to stdout
    else catHandle stdin

catFileArray :: [FilePath] -> IO ()
catFileArray files = do
    putStrLn $ "==> Number of files: " ++ (show $ length files)
    -- run `catFile` for each file passed in
    Monad.forM_ files catFile

catFile :: FilePath -> IO ()
catFile f = do
    putStrLn ("==> " ++ f)
    handle <- openFile f ReadMode
    catHandle handle

catHandle :: Handle -> IO ()
catHandle h = Monad.forever $ do
    eof <- IO.hIsEOF h
    if eof then do
        hClose h
        exitWith ExitSuccess
    else
        hGetLine h >>= putStrLn

我正在运行这样的代码:

runghc cat.hs file1 file2

你的问题是exitWith终止整个程序。所以,你不能真正使用forever循环遍历文件,因为显然您不想“永远”运行该函数,直到文件末尾。你可以重写catHandle像这样

catHandle :: Handle -> IO ()
catHandle h = do
    eof <- IO.hIsEOF h
    if eof then do
        hClose h
     else
        hGetLine h >>= putStrLn
        catHandle h

IE。如果还没有到达 EOF,我们就会递归并读取另一行。

然而,整个方法过于复杂。你可以简单地将 cat 写为

main = do
    files <- getArgs
    forM_ files $ \filename -> do
        contents <- readFile filename
        putStr contents

由于惰性 I/O,整个文件内容实际上并未加载到内存中,而是流式传输到 stdout 中。

如果您对以下运营商感到满意Control.Monad,整个程序可以缩短为

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

如何在 Haskell 中实现“cat”? 的相关文章

  • Haskell:找不到模块“Data.List.Split”

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

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • Haskell 泛化问题(涉及列表理解)

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

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 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 假设我
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 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
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • C++ 概念与 Haskell 类型类有何不同?

    Concepts TS 中的 C 概念最近已合并到 GCC 主干中 概念允许人们通过要求类型满足概念的条件 例如 可比较 来约束通用代码 Haskell 有类型类 我对 Haskell 不太熟悉 概念和类型类如何相关 概念 由概念 TS 定
  • 约束包如何工作?

    背后的想法数据 约束 Forall http hackage haskell org packages archive constraints 0 3 2 doc html src Data Constraint Forall html据我
  • Haskell:需要了解 Functor 的签名

    有人能给我解释一下 Functor 的签名吗 Prelude gt info Functor class Functor f gt where fmap a gt b gt f a gt f b lt a gt f b gt f a 我不明
  • 如何在haskell中用另一个字符串替换一个字符串

    我想用不同的字符串替换输入文件中的字符串 我正在寻找一种方法 但似乎我只能逐个字符地更改字符串 例如在我下面的代码中 replace String gt String replace replace x xs if x then y rep
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored

随机推荐

  • 什么时候应该避免使用 NHibernate 的延迟加载功能?

    我听到的关于 NHibernate 延迟加载的大部分说法是 使用它比不使用它要好 似乎最小化数据库访问以减少瓶颈是有意义的 但几乎没有什么事情是不需要权衡的 当然它会迫使你有一些限制设计virtual特性 但我也注意到一些开发人员关闭了某些
  • PostgreSQL 多维数组

    我试图将数据作为多维数组传递 但我得到的行为对我来说似乎很奇怪 具体来说 我试图从二维数组中获取单个元素 因此从二维数组中获取一维数组 但它没有按照我期望的方式工作 在下面的示例中 2 4 和 5 按我预期的方式工作 但 1 和 3 则不然
  • 如何在Python中使用日志记录打印列表项+整数/字符串

    我想打印带有项目索引的列表项目 例如 0 idx 10 degree 0 1 idx 20 degree 0 根据下面的代码 如何将 0 附加为整数 字符串 列表项 import logging class Node object slot
  • 一般最小值和最大值 - C++

    编写一个通用的最小函数 我想到了两个问题 该代码适用于任何输入类型和不同的参数编号 namespace xyz template
  • mysql MyISAM 和 InnoDB 索引使用差异

    我有这些小桌子 item and category CREATE TABLE item id mediumint 8 unsigned NOT NULL AUTO INCREMENT name varchar 150 NOT NULL ca
  • 更改复选框状态而不调用 OnClick 事件

    我想知道当我改变 CheckBox 的状态时 CheckBox gt Checked false 它调用了CheckBox OnClick事件 如何避免它 在较新的 Delphi 版本中 您可以使用类助手来添加此功能 CheckBox Se
  • 作为 MySQL 中的特定用户进行身份验证

    我是 MySQL DB 的全新用户 已经安装了 WAMPSERVER 并且通过 MySQL 控制台使用 MySQL Query 1 每次登录时 它都直接询问我root的密码 但是 我想以不同的用户身份登录 Query 2 如果我确实以 ro
  • 为什么没有调用 didRegisterForRemoteNotificationsWithDeviceToken

    我正在制作一个应用程序 我想在其中实现苹果推送通知服务 我正在按照中给出的分步说明进行操作本教程 但仍然没有调用这些方法 我不知道是什么导致了这个问题 谁能帮我 void application UIApplication applicat
  • Cassandra 启动错误,ThreadPriorityPolicy=42

    当我尝试启动 Cassandra 时 它显示了这样的错误 我已经在 env sh 文件中的 conf 文件中进行了更改 没有类似类型错误的选项适用于此 intx ThreadPriorityPolicy 42 is outside the
  • Rails 4 + simple_form 和 jQuery UI。日期选择器无法通过涡轮链接工作

    我有这个调用日期选择器的表单 Simple form 包装器 应用程序 输入 日期选择器 input rb class DatepickerInput lt SimpleForm Inputs Base def input builder
  • Python Statsmodel ARIMA 启动 [平稳性]

    我刚刚开始使用 statsmodels 进行时间序列分析 我有一个包含日期和值的数据集 大约 3 个月 我在为 ARIMA 模型提供正确的顺序时遇到一些问题 我希望根据趋势和季节性进行调整 然后计算异常值 我的 价值观 不是固定的 stat
  • Node js、JWT 令牌和背后的逻辑

    我正在使用 JWT 来保护节点 js urlhttps github com auth0 express jwt 要创建 JWT 令牌用户会话 我只需执行以下操作 gt auth signup gt jwt sign user profil
  • 如何在Android中获取气压高度?

    计算气压高度需要哪些数据 我如何获得它们然后计算海拔高度 另外 与 GPS 高度相比 气压测量的准确度如何 我尝试了 GPS 但在网上搜索了几个小时后 我找不到合适的大地水准面库 如果我有任何长的概念 请纠正我 您需要使用压力传感器测量压力
  • 如何保护移动应用程序的 REST API 安全?

    我正在尝试为移动客户端向 Django 添加 REST 接口 移动客户端将通过 HTTPS 使用 JSON 我一直无法找到为移动设备实现此目的的 最佳 方法 经过搜索 似乎 2 比 1 更有利 使用 HTTP 身份验证并建立基于 cooki
  • 如何使用正则表达式获取函数声明或定义

    我只想获得像这样的函数原型 int my func char int float void my func1 void my func2 使用正则表达式和 python 从 C 文件中获取 这是我的正则表达式格式 r n n 这是我为此类任
  • 设置 FloatingActionButton 的 src 和背景

    当我在 android support design FloatingActionbutton 中使用背景和 src 时 它设置不正确 相反 它显示为
  • 什么是“recursive_init_error”异常?

    我决定使用计算的 goto 和局部静态进行测试 void g std cout lt lt init void f int z 0 y z static int x g z 1 goto y 0 0 int main f std cout
  • 滚动行为与子 RecyclerView 和父 Viewpager2 冲突

    我有一个垂直滚动ViewPager2最后一个孩子包含一个RecyclerView沿同一方向滚动 这导致了冲突的行为 ViewPager2当我在包含此内容的页面时 总是窃取滚动事件RecyclerView 使卷轴内部的唯一方法Recycler
  • 为什么 jQuery 未在我的 Rails 3.2.3 应用程序中加载?

    直到昨天 jQuery 在我的 Rails 应用程序中加载得很好 我正在尝试安装调试器 ruby debug gem 您可能知道 Rails 3 中的调试器 gem 存在问题 并且我未能成功安装依赖项 因此我从 Gemfile 中删除了 g
  • 如何在 Haskell 中实现“cat”?

    我正在尝试写一个简单的catHaskell 中的程序 我想将多个文件名作为参数 并将每个文件依次写入STDOUT 但我的程序只打印一个文件并退出 我需要做什么才能让我的代码打印每个文件 而不仅仅是传入的第一个文件 import Contro