我有这两个代码段,我猜它们会做同样的事情,但事实并非如此。这是为什么?
这个很好用:
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]
它们之间有什么区别?
正如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)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |