gpt4 book ai didi

haskell - 与 Haskell do block 的混淆

转载 作者:行者123 更新时间:2023-12-02 18:35:24 25 4
gpt4 key购买 nike

我有以下代码:

doSomething :: [Int] -> [Int]
doSomething arg = arg ++ [1]

afterThreeTurns = do
first <- ["test"]
doSomething [1] -- COMMENT THIS
return first

这将返回:

*Main> afterThreeTurns
["test","test"]

如果我取出标记为 COMMENT THIS 的行,它会按预期返回 [“test”]。为什么?我认为 doSomething 应该对第一个没有影响?

最佳答案

doSomething [1][2,1] ,您的代码相当于:

afterThreeTurns = do
first <- ["test"]
x <- [2,1]
return first

这与列表理解相同 [ first | first <- ["test"], x <- [2,1] ]这解释了为什么您会得到长度为 2 的列表。

请注意变量 x没有在任何地方引用,所以也可以这样写:

afterThreeTurns = do
first <- ["test"]
_ <- [2,1]
return first

这是一个使用 IO 的类似案例单子(monad)。代码:

thirdLine = do
getLine
getLine
x <- getLine
putStrLn $ "The third line is: " ++ x

等同于:

thirdLine = do
_ <- getLine
_ <- getLine
x <- getLine
putStrLn $ "The third line is: " ++ x

您可以让 ghc 使用 -fwarn-unused-do-bind 标记这些类型的单子(monad)语句。编译器标志。在您的示例中 ghc 将发出警告:

...: Warning:
A do-notation statement discarded a result of type ‘Int’
Suppress this warning by saying ‘_ <- doSomething [1]’
or by using the flag -fno-warn-unused-do-bind

关于haskell - 与 Haskell do block 的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26396828/

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