Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
haskell的MapM结果?_Haskell_Io_Ghci - Fatal编程技术网

haskell的MapM结果?

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 =

在交互模式下使用mapM时: 调用mapM putStrLn[随机,文本] 输出是

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

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更好,因为我不需要构建列表。