Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List &燃气轮机&燃气轮机;运营商-穷人';哈斯凯尔的环路?_List_Haskell_Monads - Fatal编程技术网

List &燃气轮机&燃气轮机;运营商-穷人';哈斯凯尔的环路?

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

我不知道哈斯克尔,我只是想玩玩它来学习它。我试图理解io、monads等,并在解释器(GHCi,版本7.10.2,WinGHCI)中编写了以下内容:


想解释一下吗?为什么列表中元素的数量会影响“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"]