6

这是我正在编写的特定于域的文件 IO 函数的摘录:

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想到了,虽然它可以编译并且不会导致任何问题,但它会提供不需要的标准输出打印main.hs: Prelude.undefined(我在这里stack runghc main.hs用作唯一的编码环境 --- 这已经足够了,但是上面的代码将递归循环通过目录树:因此是(重新)了解更好或更确切地说是“正确”方法的好时机)。

4

1 回答 1

11

这是 Haskell 学习曲线的一个不幸方面:你会认为应该有某种库函数称为

doNothing :: IO ()

供您使用,但生态系统希望您了解类型类中的return函数,该类型类是实例Monad化的众多类型类之一。IO在这种情况下return (),应该产生创建一个IO什么都不做的动作(阅读:效果、重击或承诺)的预期行为。

您可能还对package感兴趣,它通过使用比 and 更强大的类型listDir完全copyFilepath-io消除type FilePath = String了整个问题。特别注意如何在一个元组中分别返回子目录和文件。如果这不符合 Haskell 的精神,那又是什么呢?然而,它确实带来了外部依赖,但我一直在寻找插入那个优秀库的情况。...listDir

于 2016-05-25T19:37:17.117 回答