我有这两个代码段,我猜它们可以做相同的事情,但是它们却没有。为什么会这样?
这个很好用:
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]
它们之间有什么区别?
答案 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