haskell - 如何在 Haskell 中构造一个无操作 IO() 表达式?

标签 haskell monads io-monad

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

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

我明白 mapM_ 让我们删除/忽略所有 IO () 结果,所以我想要一个更干净的替代 putStr "" - - IE。 Haskell 的“规范”方式编写“类型正确、不执行任何操作的无操作 IO(或 monad)表达式”。

从我的新手阅读中,我想到了未定义,虽然这可以编译并且不会导致任何问题,但它会给出不需要的标准输出打印main.hs:Prelude.undefined(我使用 stack runghc main.hs 作为这里的唯一编码环境 --- 这已经足够了,但是上面的代码将会循环递归地通过目录树:所以是(重新)学习更好的,或者更确切地说“正确的”方法的好时机。

最佳答案

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

doNothing :: IO ()

供您使用,但生态系统希望您了解return Monad 中的函数typeclass,IO 的众多类型类之一实例。在这种情况下return ()应该产生创建 IO 的预期行为不执行任何操作的操作(读作:效果、thunk 或 promise )。

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

关于haskell - 如何在 Haskell 中构造一个无操作 IO() 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37445713/

相关文章:

`StateT a STM b` 中的 Haskell IO 操作

haskell - 显示 IO 类型

performance - Haskell - 从 List 转换为 Data.Vector

haskell - yesod 中的 id 属性

haskell - 为什么在 monad 中使用如此奇特的函数类型?

Haskell 单词实现

haskell - IO Monad 在什么意义上是纯粹的?

haskell - 将高阶函数提升到 monad

haskell - 也许是 monad 和一个列表

haskell - 使用 MonadIO 测试类型类 : "No instance nor default method" error