Haskell语言学习笔记(91)Comprehension Extensions
Comprehension Extensions
关于解析式的相关语言扩展。
List and Comprehension Extensions
24 Days of GHC Extensions: List Comprehensions
ParallelListComp
Prelude> [(w,x,y,z) | ((w,x),(y,z)) <- zip [(w,x) | w <- [1..3], x <- [2..4]] [(y,z) | y <- [3..5], z <- [4..6]]]
[(1,2,3,4),(1,3,3,5),(1,4,3,6),(2,2,4,4),(2,3,4,5),(2,4,4,6),(3,2,5,4),(3,3,5,5),(3,4,5,6)]
语言扩展 ParallelListComp 给解析式加上了 zipWith 函数的功能。
Prelude> :set -XParallelListComp
Prelude> [(w,x,y,z) | w <- [1..3], x <- [2..4] | y <- [3..5], z <- [4..6]]
[(1,2,3,4),(1,3,3,5),(1,4,3,6),(2,2,4,4),(2,3,4,5),(2,4,4,6),(3,2,5,4),(3,3,5,5),(3,4,5,6)]
TransformListComp
Generalised (SQL-Like) List Comprehensions
Prelude> reverse [(x,y) | x <- [1..3], y <- [2..4]]
[(3,4),(3,3),(3,2),(2,4),(2,3),(2,2),(1,4),(1,3),(1,2)]
Prelude> :m +GHC.Exts
Prelude GHC.Exts> sortWith (\(x,y) -> x+y) [(x,y) | x <- [1..3], y <- [2..4]]
[(1,2),(1,3),(2,2),(1,4),(2,3),(3,2),(2,4),(3,3),(3,4)]
Prelude GHC.Exts> groupWith (\(x,y) -> x+y) [(x,y) | x <- [1..3], y <- [2..4]]
[[(1,2)],[(1,3),(2,2)],[(1,4),(2,3),(3,2)],[(2,4),(3,3)],[(3,4)]]
Prelude GHC.Exts> (,) <$> (\(x,y)->x+y) . head <*> id <$> groupWith (\(x,y) -> x+y) [(x,y) | x <- [1..3], y <- [2..4]]
[(3,[(1,2)]),(4,[(1,3),(2,2)]),(5,[(1,4),(2,3),(3,2)]),(6,[(2,4),(3,3)]),(7,[(3,4)])]
Prelude GHC.Exts> :m -GHC.Exts
Prelude> :m +Data.List
Prelude Data.List> inits [1..3]
[[],[1],[1,2],[1,2,3]]
语言扩展 TransformListComp 给解析式加上了4个关键字:then, group, by, using。
该语言扩展在功能上接近 SQL 语句中的 order by 和 group by。
Prelude> :set -XTransformListComp
Prelude> [(x,y) | x <- [1..3], y <- [2..4], then reverse]
[(3,4),(3,3),(3,2),(2,4),(2,3),(2,2),(1,4),(1,3),(1,2)]
Prelude> :m +GHC.Exts
Prelude GHC.Exts> [(x,y) | x <- [1..3], y <- [2..4], then sortWith by (x+y)]
[(1,2),(1,3),(2,2),(1,4),(2,3),(3,2),(2,4),(3,3),(3,4)]
Prelude GHC.Exts> [(x,y) | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
[([1],[2]),([1,2],[3,2]),([1,2,3],[4,3,2]),([2,3],[4,3]),([3],[4])]
Prelude GHC.Exts> [zip x y | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
[[(1,2)],[(1,3),(2,2)],[(1,4),(2,3),(3,2)],[(2,4),(3,3)],[(3,4)]]
Prelude GHC.Exts> [(zipWith (+) x y, zip x y) | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
[([3],[(1,2)]),([4,4],[(1,3),(2,2)]),([5,5,5],[(1,4),(2,3),(3,2)]),([6,6],[(2,4),(3,3)]),([7],[(3,4)])]
Prelude GHC.Exts> [(the (zipWith (+) x y), zip x y) | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
[(3,[(1,2)]),(4,[(1,3),(2,2)]),(5,[(1,4),(2,3),(3,2)]),(6,[(2,4),(3,3)]),(7,[(3,4)])]
Prelude GHC.Exts> [(z,x,y) | x <- [1..3], y <- [2..4], let z = x+y, then group by z using groupWith]
[([3],[1],[2]),([4,4],[1,2],[3,2]),([5,5,5],[1,2,3],[4,3,2]),([6,6],[2,3],[4,3]),([7],[3],[4])]
Prelude GHC.Exts> [(the z, zip x y) | x <- [1..3], y <- [2..4], let z = x+y, then group by z using groupWith]
[(3,[(1,2)]),(4,[(1,3),(2,2)]),(5,[(1,4),(2,3),(3,2)]),(6,[(2,4),(3,3)]),(7,[(3,4)])]
Prelude GHC.Exts> :m +Data.List
Prelude GHC.Exts Data.List> [x | x <- [1..3], then group using inits]
[[],[1],[1,2],[1,2,3]]
MonadComprehensions
{-# LANGUAGE TransformListComp, MonadComprehensions #-}
l :: [(String, Int)]
l = [("a", 1), ("b", 2), ("c", 3)]
main = print [ (x, y) | x <- lookup "a" l,
y <- lookup "b" l,
then (\f ->
maybe Nothing
(\x -> if f x == 2
then Just x
else Nothing))
by (x * y) ] -- Just (1,2)
Haskell语言学习笔记(91)Comprehension Extensions的更多相关文章
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Haskell语言学习笔记(79)lambda演算
lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...
- Haskell语言学习笔记(69)Yesod
Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...
- Haskell语言学习笔记(20)IORef, STRef
IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...
- Haskell语言学习笔记(39)Category
Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...
- Haskell语言学习笔记(44)Lens(2)
自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...
- Haskell语言学习笔记(72)Free Monad
安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...
- Haskell语言学习笔记(38)Lens(1)
Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...
- Haskell语言学习笔记(92)HXT
HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...
随机推荐
- Dataset,DataTable
public DataTable test(int id) { var dt = GetLanguageDataTable(pfAppId); dt.AsEnumerable().ToList().F ...
- 读取txt文件赋值到DataGridView中
先查看txt是每条信息之间是通过什么分割,我是通过换行符(\n)分割的, 然后再看每一条信息中字段是通过什么分割,我的字段是通过 tab键(\t)分割. 第一步 先获取到txt文件的路径: //获取绝 ...
- spring启动找不到spring.liveBeansView.mbeanDomain配置
做项目时,启动tomcat报错 JNDI lookup for name [spring.liveBeansView.mbeanDomain] threw NamingException with m ...
- org.springframework.boot.builder.SpringApplicationBuilder.<init>
新建了一个Spring cloud项目,启动时报错org.springframework.boot.builder.SpringApplicationBuilder.<init> 翻阅资料 ...
- MySQL通过游标来实现通过查询结果集循环
/*我们有时候会遇到需要对 从A表查询的结果集S_S 的记录 进行遍历并做一些操作(如插入),且这些操作需要的数据或许部分来自S_S集合*/ /*临时存储过程,没办法,不能直接在查询窗口做这些事.*/ ...
- ES6入门声明
let.var区别点 1.let只在命令所在的代码块中有效. 2.变量一定要先声明在使用,否则会报错,不存在Es5的变量提升(暂时性死区,不存在重复使用). 3.块级作用域中存在let命令,所声明的变 ...
- [多线程]线程基础(对象锁、class锁、同步、异步)
synchronized.volatile.ReentrantLock.concurrent 线程安全:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法) ...
- JVM jmap dump 分析dump文件 / 如何使用Eclipse MemoryAnalyzer MAT 排查线上问题
jhat简介 jhat用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言 这个工具并不是想用于应用系统中而是用于"离线" ...
- (1)Linux操作系统的安装
1.安装Vmware Workstation 如何判断Vmware是否安装成功? 我的电脑控制面板 --> 网络和Internet --> 查看网络状态和任务 --> 更改适配器设置 ...
- 1. @ModelAttribute注解
添加@ModelAttribute修饰的方法,在每个目标方法调用前都会执行该方法. 一般情况下,在form表单修改的时,某项字段规定为不可更改,就需要使用该注解标注的方法,根据id的获取与否,来从数据 ...