无法将预期类型“ IO [String]”与实际类型“ [String]”匹配

时间:2019-05-11 17:32:37

标签: haskell io-monad

我有这两个代码段,我猜它们可以做相同的事情,但是它们却没有。为什么会这样?

这个很好用:

fdup :: String -> IO ()
fdup filename = do
        h <- openFile filename ReadMode
        c <- hGetContents h
        putStr $ unlines $ parse $ lines c
        hClose h

此错误返回错误Couldn't match expected type ‘IO [String]’ with actual type ‘[String]’

fdup' :: String -> IO ()
fdup' filename = do
        h <- openFile filename ReadMode
        c <- hGetContents h
        ls <- lines c
        putStr $ unlines $ parse $ ls
        hClose h

parse :: [String] -> [String]

它们之间有什么区别?

1 个答案:

答案 0 :(得分:5)

正如Willem Van Onsem解释的那样,您不需要在该特定位置放置<-,因为lines c只是一个字符串列表,而不是IO计算。如果您想给它起个名字,可以改用let绑定:

fdup' :: String -> IO ()
fdup' filename = do
        h <- openFile filename ReadMode
        c <- hGetContents h
        let ls = lines c
        putStr $ unlines $ parse $ ls
        hClose h