Comprehension Extensions

关于解析式的相关语言扩展。

List and Comprehension Extensions

24 Days of GHC Extensions: List Comprehensions

ParallelListComp

  1. 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]]]
  2. [(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 函数的功能。

  1. Prelude> :set -XParallelListComp
  2. Prelude> [(w,x,y,z) | w <- [1..3], x <- [2..4] | y <- [3..5], z <- [4..6]]
  3. [(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

  1. Prelude> reverse [(x,y) | x <- [1..3], y <- [2..4]]
  2. [(3,4),(3,3),(3,2),(2,4),(2,3),(2,2),(1,4),(1,3),(1,2)]
  3. Prelude> :m +GHC.Exts
  4. Prelude GHC.Exts> sortWith (\(x,y) -> x+y) [(x,y) | x <- [1..3], y <- [2..4]]
  5. [(1,2),(1,3),(2,2),(1,4),(2,3),(3,2),(2,4),(3,3),(3,4)]
  6. Prelude GHC.Exts> groupWith (\(x,y) -> x+y) [(x,y) | x <- [1..3], y <- [2..4]]
  7. [[(1,2)],[(1,3),(2,2)],[(1,4),(2,3),(3,2)],[(2,4),(3,3)],[(3,4)]]
  8. Prelude GHC.Exts> (,) <$> (\(x,y)->x+y) . head <*> id <$> groupWith (\(x,y) -> x+y) [(x,y) | x <- [1..3], y <- [2..4]]
  9. [(3,[(1,2)]),(4,[(1,3),(2,2)]),(5,[(1,4),(2,3),(3,2)]),(6,[(2,4),(3,3)]),(7,[(3,4)])]
  10. Prelude GHC.Exts> :m -GHC.Exts
  11. Prelude> :m +Data.List
  12. Prelude Data.List> inits [1..3]
  13. [[],[1],[1,2],[1,2,3]]

语言扩展 TransformListComp 给解析式加上了4个关键字:then, group, by, using。

该语言扩展在功能上接近 SQL 语句中的 order by 和 group by。

  1. Prelude> :set -XTransformListComp
  2. Prelude> [(x,y) | x <- [1..3], y <- [2..4], then reverse]
  3. [(3,4),(3,3),(3,2),(2,4),(2,3),(2,2),(1,4),(1,3),(1,2)]
  4. Prelude> :m +GHC.Exts
  5. Prelude GHC.Exts> [(x,y) | x <- [1..3], y <- [2..4], then sortWith by (x+y)]
  6. [(1,2),(1,3),(2,2),(1,4),(2,3),(3,2),(2,4),(3,3),(3,4)]
  7. Prelude GHC.Exts> [(x,y) | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
  8. [([1],[2]),([1,2],[3,2]),([1,2,3],[4,3,2]),([2,3],[4,3]),([3],[4])]
  9. Prelude GHC.Exts> [zip x y | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
  10. [[(1,2)],[(1,3),(2,2)],[(1,4),(2,3),(3,2)],[(2,4),(3,3)],[(3,4)]]
  11. Prelude GHC.Exts> [(zipWith (+) x y, zip x y) | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
  12. [([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)])]
  13. Prelude GHC.Exts> [(the (zipWith (+) x y), zip x y) | x <- [1..3], y <- [2..4], then group by (x+y) using groupWith]
  14. [(3,[(1,2)]),(4,[(1,3),(2,2)]),(5,[(1,4),(2,3),(3,2)]),(6,[(2,4),(3,3)]),(7,[(3,4)])]
  15. Prelude GHC.Exts> [(z,x,y) | x <- [1..3], y <- [2..4], let z = x+y, then group by z using groupWith]
  16. [([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])]
  17. Prelude GHC.Exts> [(the z, zip x y) | x <- [1..3], y <- [2..4], let z = x+y, then group by z using groupWith]
  18. [(3,[(1,2)]),(4,[(1,3),(2,2)]),(5,[(1,4),(2,3),(3,2)]),(6,[(2,4),(3,3)]),(7,[(3,4)])]
  19. Prelude GHC.Exts> :m +Data.List
  20. Prelude GHC.Exts Data.List> [x | x <- [1..3], then group using inits]
  21. [[],[1],[1,2],[1,2,3]]

MonadComprehensions

  1. {-# LANGUAGE TransformListComp, MonadComprehensions #-}
  2. l :: [(String, Int)]
  3. l = [("a", 1), ("b", 2), ("c", 3)]
  4. main = print [ (x, y) | x <- lookup "a" l,
  5. y <- lookup "b" l,
  6. then (\f ->
  7. maybe Nothing
  8. (\x -> if f x == 2
  9. then Just x
  10. else Nothing))
  11. by (x * y) ] -- Just (1,2)

Haskell语言学习笔记(91)Comprehension Extensions的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  6. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

  7. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

  8. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  9. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

随机推荐

  1. keepalived主备节点都配置vip,vip切换异常案例分析

    原文地址:http://blog.51cto.com/13599730/2161622 参考地址:https://blog.csdn.net/qq_14940627/article/details/7 ...

  2. MySQL 之迁移用户及权限

    参考来源: https://www.cnblogs.com/huangmr0811/p/5570994.html https://blog.csdn.net/u011665746/article/de ...

  3. IDEA配置打可运行jar包

    IDEA打包可以运行的jar包大体有两种方式:一种是比较方便的配置maven:一种是直接配置IDEA采用Build Artifacts打包. 配置maven打包,在pom.xml里面配置build插件 ...

  4. CRM 2016 一个IFrame_A 刷新另一个 IFrame_B

    思路是 : 1 创建一个字段“new_xxx”. 2 注册字段 OnChange 事件. 3 OnChange 事件 刷新 IFrame_B子页面. CRM父页面JS: /// <summary ...

  5. [电脑知识点]Excel取消受保护视图

  6. windows下解决python输出utf-8中文

    class UnicodeStreamFilter: def __init__(self, target): self.target = target self.encoding = 'utf-8' ...

  7. Ubuntu 16.04 fatal: Unable to find remote helper for 'https'

    在Windows10 的Linux子系统下安装oh-my-zsh的时候出现如下错误: fatal: Unable to find remote helper for 'https' 网上有描述说没有安 ...

  8. etree和Beautiful Soup的使用

    1.lxml 是一种使用 Python 编写的库,可以迅速.灵活地处理 XML ,支持 XPath (XML Path Language),使用 lxml 的 etree 库来进行爬取网站信息 2.B ...

  9. HDU1847 Good Luck in CET-4 Everybody 博弈 SG函数

    题意:给定n张牌,两个人轮流摸牌,每次摸牌张数为2的幂次,问先手胜还是后手胜  n≤1000 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 # ...

  10. BLOB TO CLOB

    CREATE OR REPLACE FUNCTION blob_to_clob (blob_in IN BLOB) RETURN CLOB AS v_clob CLOB; v_varchar VARC ...