当前位置:  开发笔记 > 程序员 > 正文

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

如何解决《哈斯克尔:'做[1,2,3];["你好"]'行为澄清》经验,为你挑选了1个好方法。

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

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

Prelude> do [1, 2, 3]; "hello"

回报

"hellohellohello"

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



1> Joachim Brei..:
do [1, 2, 3]; "hello"

des to to to

[1, 2, 3] >> "hello"

这是一样的

[1, 2, 3] >>= (\_ -> "hello")

这是一样的

concatMap (\_ -> "hello") [1, 2, 3]

这是一样的

concat (map (\_ -> "hello") [1, 2, 3])

这是一样的

concat [(\_ -> "hello") 1, (\_ -> "hello") 2, (\_ -> "hello") 3])

这是一样的

concat ["hello","hello","hello"]

这是一样的

"hellohellohello"


我认为这里的关键点是`list >> = f`被定义为`concatMap f list`.直觉是列表表示非确定性计算,因此`[1,2,3]`是具有三个可能输出的计算.当您将其与函数绑定时,结果是该函数应用于所有可能的输出.
推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有