【发布时间】:2020-05-01 14:24:25
【问题描述】:
我是 Haskell 的新手,想在 do 块中执行递归。
countLines :: String -> IO Int
countLines filePath = do
isFile <- doesFileExist filePath
if isFile
then do contents <- readFile filePath
print contents
pure 0
else do files <- getDirectoryContents filePath
[countLines(file) | file <- files] -- recursion here!
pure 0
在我添加这个列表理解之前,一切正常,但是一旦我添加这个,我得到以下错误:
Main.hs:59:17: error:
• Couldn't match type ‘[]’ with ‘IO’
Expected type: IO (IO Int)
Actual type: [IO Int]
• In a stmt of a 'do' block: [countLines (file) | file <- files]
In the expression:
do files <- getDirectoryContents filePath
[countLines (file) | file <- files]
pure 0
In a stmt of a 'do' block:
if isFile then
do contents <- readFile filePath
print contents
pure 0
else
do files <- getDirectoryContents filePath
[countLines (file) | file <- files]
pure 0
|
59 | [countLines(file) | file <- files]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
bash-3.2$
有人知道如何解决这个问题吗?
【问题讨论】:
-
您可以使用
sequence函数将操作列表(如[ countFile(file) | file <- files ])转换为执行所有操作的操作