以下是我正在编写的特定于域的文件 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/