gpt4 book ai didi

haskell - MapM 在 haskell 中的结果?

转载 作者:行者123 更新时间:2023-12-02 17:25:44 28 4
gpt4 key购买 nike

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

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"

用指示线我不太明白为什么我看不到[()..()] 作为我运行此脚本时的输出;我认为 mapM 不会忽略结果

最佳答案

I thought mapM does not disregard the result

您的想法是正确的。忽略结果的是您的代码,而不是 mapM;特别是,

do
mapM putStrLn numberedTasks
postamble

被脱糖到 mapM putStrLn numberedTasks >> postamble,并且 (>>) 忽略其左参数的结果。

I do not quite understand why i don't see [()..()]

实际上,我怀疑您不理解的是为什么您确实在 GHCi 中看到 [(),()]。这是因为,虽然 GHCi 的行为有点像在一个巨大的 do block 中,但事实并非如此。特别是它会尝试向您展示部分结果。所以 GHCi 在这里做了一些特别的事情:它正在采取你的行动,运行它,另外为行动的结果添加一个 print 语句。

如果您不想看到它被打印出来,有几种选择;可能最好的方法是将 mapM 替换为 mapM_; ghci 有特殊的代码,当 IO 操作的结果是 () 时,可以避免添加 print 语句。

关于haskell - MapM 在 haskell 中的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708386/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com