在haskell中MapM的结果?

Zub*_*air 1 io haskell ghci

在交互模式下使用mapM时:调用mapM putStrLn ["random","Text"] 输出是

random
text
[(),()]
Run Code Online (Sandbox Code Playgroud)

但是当我从脚本调用相同的函数然后运行脚本时:

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不会忽视结果

Dan*_*ner 5

我以为mapM不会忽视结果

你没想到.这是你的代码,而不是mapM忽视结果; 特别是,

do
    mapM putStrLn numberedTasks
    postamble
Run Code Online (Sandbox Code Playgroud)

变得卑鄙mapM putStrLn numberedTasks >> postamble,并且(>>)无视其左派论证的结果.

我不太明白为什么我没有看到 [()..()]

其实,我怀疑你不明白的是为什么你[(),()]在GHCI.这是因为,虽然GHCi表现得有点像在一个巨大的do块中,但它并不完全.特别是它试图在整个过程中向您展示部分结果.所以GHCi在这里做了一些特别的事情:它正在采取行动,运行它,并另外print为行动的结果添加一个声明.

如果您不希望看到这个打印出来,有几种选择; 可能是最好的一个是取代mapMmapM_; ghci有特殊的代码,可以避免printIO动作结果出现时添加语句().