haskell中列表生成器的真正意义

haskell中列表生成器的真正意义,haskell,Haskell,据我所知,代码 l = [(a,b)|a<-[1,2],b<-[3,4]] 此类表达式的类型为[(t,t1)],其中t和t1以Num表示 如果我写了这样的东西 getLine >>= (\a -> getLine >>= (\b -> return (a,b))) 解释器读取两行并返回包含它们的元组 但是我可以在列表生成器中使用getLine或类似的东西吗 表情 [x|x<-getLine] [x | x>=) 列表生成器的意义是什么?

据我所知,代码

l = [(a,b)|a<-[1,2],b<-[3,4]]
此类表达式的类型为[(t,t1)],其中t和t1以Num表示

如果我写了这样的东西

getLine >>= (\a -> getLine >>= (\b -> return (a,b)))
解释器读取两行并返回包含它们的元组

但是我可以在列表生成器中使用getLine或类似的东西吗

表情

[x|x<-getLine]
[x | x>=)

列表生成器的意义是什么?它们和do符号之间的实际区别是什么


使用列表生成器时是否有任何类型限制?

我的理解是,列表理解只能用于构造列表

然而,有一个名为“monad comprehensions”的语言扩展,允许您使用任意monad


这是一个明智的观察,你不是第一个偶然发现这一点的人。你是对的,
[x | x:set-XMonadComprehensions的翻译

序曲>[x | xI听到谣言说,理解过去适用于任何单子,但错误信息无法理解,所以它被更改了。不过,我没有引用这一点……好吧,如果在过去,翻译纯粹是重写,独立于类型检查……可能在有人严格应用t中的代表之前他报告。@MathematicalArchid:There's and;两者都表明MonadComprehension最初是允许的,然后被删除,然后通过语言扩展添加回来。@Zeta…所以它出现在Haskell 1.4中。我希望我没有想象到它…:)
getLine >>= (\a -> getLine >>= (\b -> return (a,b)))
[x|x<-getLine]
Prelude> :set -XMonadComprehensions 
Prelude> [x|x<-getLine]
sdf
"sdf"