据我所知,代码
l = [(a,b)|a<-[1,2],b<-[3,4]]等同于
l = do
a <- [1,2]
b <- [3,4]
return (a,b)或
[1,2] >>= (\a -> [3,4] >>= (\b -> return (a,b)))这种表达式的类型是(t,t1),其中t和t1是Num。
如果我写下这样的代码
getLine >>= (\a -> getLine >>= (\b -> return (a,b)))解释器读取两行并返回包含这两行的元组。
但是我可以在列表生成器中使用getLine或类似的东西吗?
表达式
[x|x<-getLine]返回错误“无法匹配预期类型的[t0]' with actual typeIO字符串”
但是,当然,这在do-notation或使用(>>=)中有效。
列表生成器的意义是什么,它们与do-notation之间的实际区别是什么?
使用list gens时是否有类型限制?
发布于 2016-02-11 18:40:32
这是一个明智的观察,你并不是第一个发现这一点的人。您说得对,[x|x<-getLine]的翻译将导致一个完全有效的一元表达式。重点是,我认为,列表理解只是为了方便列表语法而引入的first,(可能)没有人认为人们会将它们用于其他monads。
但是,由于对[]的限制实际上并不是必需的,因此有一个名为-XMonadComprehensions的GHC扩展,它删除了该限制,并允许您准确地编写所需的内容:
Prelude> :set -XMonadComprehensions
Prelude> [x|x<-getLine]
sdf
"sdf"发布于 2016-02-11 18:40:24
我的理解是,列表理解只能用于构造列表。
但是,有一种称为"monad comprehensions“的语言扩展,它允许您使用任意的monad。
https://stackoverflow.com/questions/35336834
复制相似问题