首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskell中列表生成器的真正意义

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

Stack Overflow用户
提问于 2016-02-11 18:32:58
回答 2查看 95关注 0票数 4

据我所知,代码

代码语言:javascript
复制
l = [(a,b)|a<-[1,2],b<-[3,4]]

等同于

代码语言:javascript
复制
l = do
  a <- [1,2]
  b <- [3,4]
  return (a,b)

代码语言:javascript
复制
[1,2] >>= (\a -> [3,4] >>= (\b -> return (a,b)))

这种表达式的类型是(t,t1),其中t和t1是Num。

如果我写下这样的代码

代码语言:javascript
复制
getLine >>= (\a -> getLine >>= (\b -> return (a,b)))

解释器读取两行并返回包含这两行的元组。

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

表达式

代码语言:javascript
复制
[x|x<-getLine]

返回错误“无法匹配预期类型的[t0]' with actual typeIO字符串”

但是,当然,这在do-notation或使用(>>=)中有效。

列表生成器的意义是什么,它们与do-notation之间的实际区别是什么?

使用list gens时是否有类型限制?

EN

回答 2

Stack Overflow用户

发布于 2016-02-11 18:40:32

这是一个明智的观察,你并不是第一个发现这一点的人。您说得对,[x|x<-getLine]的翻译将导致一个完全有效的一元表达式。重点是,我认为,列表理解只是为了方便列表语法而引入的first,(可能)没有人认为人们会将它们用于其他monads。

但是,由于对[]的限制实际上并不是必需的,因此有一个名为-XMonadComprehensions的GHC扩展,它删除了该限制,并允许您准确地编写所需的内容:

代码语言:javascript
复制
Prelude> :set -XMonadComprehensions 
Prelude> [x|x<-getLine]
sdf
"sdf"
票数 9
EN

Stack Overflow用户

发布于 2016-02-11 18:40:24

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

但是,有一种称为"monad comprehensions“的语言扩展,它允许您使用任意的monad。

https://ghc.haskell.org/trac/ghc/wiki/MonadComprehensions

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35336834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档