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

T.P*_*Poe 0 haskell io-monad

我有这两个代码段,我猜它们会做同样的事情,但事实并非如此。这是为什么?

这个很好用:

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

这返回一个错误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
Run Code Online (Sandbox Code Playgroud)

parse :: [String] -> [String]

它们之间有什么区别?

dup*_*ode 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
Run Code Online (Sandbox Code Playgroud)