gpt4 book ai didi

Haskell:理解绑定(bind)和>>函数

转载 作者:行者123 更新时间:2023-12-02 17:00:29 24 4
gpt4 key购买 nike

我有以下 Haskell 表达式:

a = getLine >>= putStrLn . filter isDigit >> a

我无法理解上述表达式的工作原理。我知道 >>= 函数采用一个单子(monad)值和一个函数(采用正常值并返回一个单子(monad)值),并返回一个单子(monad)值。

我知道 getLineputStrLn 具有以下类型声明:

getLine :: IO String 
putStrLn :: String -> IO ()

所以表达式的以下部分:

a = getLine >>= putStrLn . filter isDigit

将返回一个IO ()。然而,函数>>采用第一一元值和第二一元值并返回第二一元值。

给定原始表达式,传递给 >> 的第一个参数将是 IO String 类型。第二个参数是a

我的问题是,a 的类型是什么,上面的表达式如何持续获取用户输入并仅将输入的数字部分打印回屏幕?任何见解都值得赞赏。

最佳答案

注意:我将 a 重命名为函数为 readPrintLoop根据@SamuelBarr的建议,因为这可以避免一些困惑。

My question is, what is the type of readPrintLoop, and how does the above expression work to continually take user input and print only the numeric part of the input back to the screen?

readPrintLoop类型:readPrintLoop :: <b>IO a</b>所以它是 IOa可以是任何类型,因为我们永远不会“返回”该值,所以我们永远不会结束这个函数。

该函数不断重复,因为 readPrintLoop是根据其本身来定义的。 readPrintLoop定义为:

readPrintLoop :: IO a
<b>readPrintLoop</b> = getLine >>= putStrLn . filter isDigit >> <b>readPrintLoop</b>

因此我们这里有无限递归,因为最终你会遇到 a ,然后将其替换为另一个 getLine >>= putStrLn . filter isDigit >> a等等。

However, the function >> takes a first monadic value and a second monadic value and returns the second monadic value.

(>>)相当于:

(>>) :: Monad m => m a -> m b -> m b
u >> v = u >>= (\_ -> v)

所以执行a相当于:

readPrintLoop :: IO a
<b>readPrintLoop</b> = getLine >>= putStrLn . filter isDigit >>= \_ -> <b>readPrintLoop</b>

这里是下划线变量_将通过() .

关于Haskell:理解绑定(bind)和>>函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57217952/

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