如何在Haskell中构建一个空IO()表达式?

6

这是我正在编写的一个特定领域文件输入输出函数的摘录:

let
    cp :: FilePath -> IO ()
    cp "." = putStr "" -- OUCH!
    cp ".." = putStr "" -- CRIKEY!
    cp fname = custom logic here...
in mapM_ cp filepaths

我了解mapM_让我们丢弃/忽略所有的IO ()结果,因此我想要一个更干净的替代方案来代替putStr "" --- 也就是Haskell中写"类型正确的无操作IO(或monad)表达式的规范方式,什么也不做"。
从我的初学者阅读中,我有undefined在脑海中,虽然这个代码可以编译并且没有问题,但它会产生一个不想要的stdout打印main.hs: Prelude.undefined(我使用stack runghc main.hs作为唯一的编码环境---它对于这个很够用,但以上代码将会递归地通过目录树循环:因此现在是学习更好的或者说“正确”的方法的好时机)。

8
尝试运行 cp "." = return () - hao
1
@haoformayor:那应该就是一个答案了 :-) - Antal Spector-Zabusky
1个回答

11
这是Haskell学习曲线中的不幸之处:你会认为应该有一些名为的库函数。
doNothing :: IO ()

这里提供了一些可以使用的内容,但生态系统希望您知道Monad类型类中的return函数,这是许多IO实例之一。在这种情况下,return ()应该产生所需的行为,创建一个不执行任何操作的IO动作(即效果、惰性求值或承诺)。

您可能还会对path-io包中的listDircopyFile感兴趣,它使用比type FilePath = String更强的类型,能够完全摆脱...的问题。特别要注意的是,listDir将子目录和文件分别作为元组返回。如果这不符合Haskell的精神,那还有什么符合呢?然而,它确实引入了外部依赖项,但我总是在寻找机会来使用这个优秀的库。


感谢您详尽的解释、及时的 return 提醒和建议!(是的,对于这个一次性工作,我想要零配置,零依赖,并且在任何只有纯净 Stack 的机器上都能够立即运行ghc。但对于其他工作,path-io听起来非常优秀。) - metaleap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接