haskell的MapM结果?
在交互模式下使用mapM时: 调用mapM putStrLn[随机,文本] 输出是 但是,当我从脚本调用相同的函数,然后运行脚本时:haskell的MapM结果?,haskell,io,ghci,Haskell,Io,Ghci,在交互模式下使用mapM时: 调用mapM putStrLn[随机,文本] 输出是 但是,当我从脚本调用相同的函数,然后运行脚本时: main = do handle <- openFile "todo.txt" ReadMode (tempName, tempHandle) <- openTempFile "." "temp" contents <- hGetContents handle let todoTasks =
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不会忽略结果
我认为mapM不会忽略结果
你想得对。忽略结果的是您的代码,而不是mapM;特别是,
do
mapM putStrLn numberedTasks
postamble
获取对mapM putStrLn numberedTasks>>后同步码的去糖化,并>>忽略其左参数的结果
我不太明白为什么我看不见
事实上,我怀疑你不明白的是为什么你会在GHCi中看到[,]。这是因为,尽管GHCi的行为有点像在一个巨大的do块中,但并不完全如此。特别是,它试图向您展示整个过程中的部分结果。因此,GHCi在这里做了一些特别的事情:它执行您的操作,运行它,并为操作的结果另外添加一个print语句
如果您不希望看到打印出来,有几个选项;也许最好的办法是用mapM替换mapM;ghci具有特殊代码,可以避免在IO操作的结果为空时添加打印语句
我认为mapM不会忽略结果
你想得对。忽略结果的是您的代码,而不是mapM;特别是,
do
mapM putStrLn numberedTasks
postamble
获取对mapM putStrLn numberedTasks>>后同步码的去糖化,并>>忽略其左参数的结果
我不太明白为什么我看不见
事实上,我怀疑你不明白的是为什么你会在GHCi中看到[,]。这是因为,尽管GHCi的行为有点像在一个巨大的do块中,但并不完全如此。特别是,它试图向您展示整个过程中的部分结果。因此,GHCi在这里做了一些特别的事情:它执行您的操作,运行它,并为操作的结果另外添加一个print语句
如果您不希望看到打印出来,有几个选项;也许最好的办法是用mapM替换mapM;ghci有特殊的代码,可以避免在IO操作的结果为时添加print语句。REPL打印表达式和IO操作的结果,但当您正常运行某项操作而不使用其结果时,它只是…未使用。它不会被打印或其他任何东西。在@AlexisKing上扩展,REPL或多或少可以做到这一点{行使用MaMy.AHH,我看,比你!在任何情况下使用MMAMI都更好,因为我不需要构建列表。RePL打印表达式和IO动作的结果,但是当你正常运行而不使用它的结果时,它只是…未被使用。它没有打印或任何东西。扩展到@ AlxistGin,RePL或多或少。是否使用MpMy.{行}。我看到,比你!无论如何,使用MMAMI更好,因为我不需要构建列表。