哈斯克尔:'做[1,2,3]; ["你好"]'行为澄清

And*_*eas 3 monads haskell do-notation

所以我试图准确理解Haskell do符号是如何工作的.据我所知,它与monad一起使用,它基本上扩展(因为它实际上是语法糖)到与bind(>>=)或then(>>)连接的匿名函数,如下所示https://en.wikibooks.org/wiki/Haskell/Syntactic_sugar #Do_notation.

但是我的问题是为什么以下命令

Prelude> do [1, 2, 3]; "hello"
Run Code Online (Sandbox Code Playgroud)

回报

"hellohellohello"
Run Code Online (Sandbox Code Playgroud)

我知道数组实际上是monad(并且这些字符串是字符数组)但是我没有看到它如何导致上面的行为.

Joa*_*ner 18

do [1, 2, 3]; "hello"
Run Code Online (Sandbox Code Playgroud)

des to to to

[1, 2, 3] >> "hello"
Run Code Online (Sandbox Code Playgroud)

这是一样的

[1, 2, 3] >>= (\_ -> "hello")
Run Code Online (Sandbox Code Playgroud)

这是一样的

concatMap (\_ -> "hello") [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

这是一样的

concat (map (\_ -> "hello") [1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

这是一样的

concat [(\_ -> "hello") 1, (\_ -> "hello") 2, (\_ -> "hello") 3])
Run Code Online (Sandbox Code Playgroud)

这是一样的

concat ["hello","hello","hello"]
Run Code Online (Sandbox Code Playgroud)

这是一样的

"hellohellohello"
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里的关键点是`list >> = f`被定义为`concatMap f list`.直觉是列表表示非确定性计算,因此`[1,2,3]`是具有三个可能输出的计算.当您将其与函数绑定时,结果是该函数应用于所有可能的输出. (2认同)