在交互模式下使用mapM时:调用mapM putStrLn ["random","Text"]
输出是
Run Code Online (Sandbox Code Playgroud)random text [(),()]
但是当我从脚本调用相同的函数然后运行脚本时:
main = do
handle <- openFile "todo.txt" ReadMode
(tempName, tempHandle) <- openTempFile "." "temp"
contents <- hGetContents handle
let todoTasks = lines contents
numberedTasks = zipWith (\n line -> show n ++ "-" ++ line) [0..] todoTasks
putStrLn "These are your TO-DO items:"
mapM putStrLn numberedTasks -- <<<<<<<< HERE <<<<<<<<
putStrLn "Which one do you want to delete?"
numberString <- getLine
let number = read numberString
newTodoItems = delete (todoTasks !! number) todoTasks
hPutStr tempHandle $ unlines newTodoItems
hClose handle
hClose tempHandle
removeFile "todo.txt"
renameFile tempName "todo.txt"
Run Code Online (Sandbox Code Playgroud)
用指示的行我不太明白为什么我[()..()]在运行这个脚本时看不到
输出; 我以为mapM不会忽视结果
我以为
mapM不会忽视结果
你没想到.这是你的代码,而不是mapM忽视结果; 特别是,
do
mapM putStrLn numberedTasks
postamble
Run Code Online (Sandbox Code Playgroud)
变得卑鄙mapM putStrLn numberedTasks >> postamble,并且(>>)无视其左派论证的结果.
我不太明白为什么我没有看到
[()..()]
其实,我怀疑你不明白的是为什么你不看[(),()]在GHCI.这是因为,虽然GHCi表现得有点像在一个巨大的do块中,但它并不完全.特别是它试图在整个过程中向您展示部分结果.所以GHCi在这里做了一些特别的事情:它正在采取行动,运行它,并另外print为行动的结果添加一个声明.
如果您不希望看到这个打印出来,有几种选择; 可能是最好的一个是取代mapM用mapM_; ghci有特殊的代码,可以避免print在IO动作结果出现时添加语句().