List &燃气轮机&燃气轮机;运营商-穷人';哈斯凯尔的环路?
我不知道哈斯克尔,我只是想玩玩它来学习它。我试图理解io、monads等,并在解释器(GHCi,版本7.10.2,WinGHCI)中编写了以下内容:List &燃气轮机&燃气轮机;运营商-穷人';哈斯凯尔的环路?,list,haskell,monads,List,Haskell,Monads,我不知道哈斯克尔,我只是想玩玩它来学习它。我试图理解io、monads等,并在解释器(GHCi,版本7.10.2,WinGHCI)中编写了以下内容: 想解释一下吗?为什么列表中元素的数量会影响“ok”的写入次数(或者在最后一种情况下,数组的写入次数)?>>操作员不应该这样做,是吗?首先请注意,这与IO没有任何关系。它与单子有关,但与一个非常具体的单子有关:列表单子 instance Monad [] where return x = [x] f >>= xs = concat
想解释一下吗?为什么列表中元素的数量会影响“ok”的写入次数(或者在最后一种情况下,数组的写入次数)?>>操作员不应该这样做,是吗?首先请注意,这与
IO
没有任何关系。它与单子有关,但与一个非常具体的单子有关:列表单子
instance Monad [] where
return x = [x]
f >>= xs = concat $ map f xs -- aka `(>>=) = concatMap`.
最为人所知的是列表理解,它基本上是语法糖†:
现在,a>>b
只是a>=\\\\->b
的一条捷径,即它忽略了LHS一元动作中包含的值,但“假装”在RHS中使用它们。所以,[1,1,1]>>“ok”
与
[ "ok" | _ <- [1,1,1] ]
如果省略单例返回
,则每个确定
将不会被包装在列表中,而那些串接在一起,而是字符串本身都由一元绑定连接在一起。这就是你如何得到“好的”
†等效的默认实现实际上有点不同,但是使用
-XMonadComprehensions
扩展,列表理解确实是这样工作的。所以我无意中使用了列表单子,而不是列表?我猜在那行代码中,一个真实的列表甚至不会被解释器接受?@user3355020:当然,它是一个列表,和任何列表一样真实。谈论列表单子只意味着我们关注列表的一个特定特性/属性。
[ result x y z | x <- bla, y <- foo x, z <- bar ]
bla >>=
\x -> foo x >>=
\y -> bar >>=
\z -> return (result x y z)
[ "ok" | _ <- [1,1,1] ]
["ok", "ok", "ok"]