Haskell List理解语法

sau*_*atz 1 haskell list-comprehension

我试图在Monad.Reader问题8中理解Brent Yorgey的多集分区算法.自从我写了任何Haskell以来已经有很长一段时间了,我想我甚至忘记了基本的东西.我坚持这个清单中的代码:

在此输入图像描述

我应该告诉你,这Vec是一个类型别名[Int],这<|=意味着向量的分量比较:

在此输入图像描述

该函数withinFromTo应该返回非负矢量分量地的名单<= m,以及按字典之间s以及e(含).

我被困在线上:

[x:xs | x <- [start, (start-1)..end] 
Run Code Online (Sandbox Code Playgroud)

什么[start, (start-1)..end]意思?我去了tryhaskell.org尝试评估,[3,2..7]但它只是给了我[].

我知道这看起来像是一个愚蠢的问题,但我无法通过谷歌搜索找到任何东西,而且我觉得我可以在浏览文档之前阅读文档很长时间.

谢谢你的帮助.

Dan*_*ner 6

[a, b .. c]语法的目的是使该开头算术级数ab,并继续直到它击中c.用一些例子解释它可能是最简单的:

> [3, 2 .. 0]
[3,2,1,0]
> [2, 4 .. 10]
[2,4,6,8,10]
> [3, 1 .. -10]
[3,1,-1,-3,-5,-7,-9]
Run Code Online (Sandbox Code Playgroud)

在Haskell的报告部分等差数列,与上一节一起Enum类型类具有的全部细节:

算术序列满足这些身份:

[ e1.. ]      = enumFrom e1
[ e1,e2.. ]   = enumFromThen e1 e2
[ e1..e3 ]    = enumFromTo e1 e3
[ e1,e2..e3 ] = enumFromThenTo e1 e2 e3
Run Code Online (Sandbox Code Playgroud)

其中enumFrom,enumFromThen,enumFromTo,和enumFromThenTo是在类类方法Enum中的定义,Prelude(见图6.1).

对于类型IntInteger,枚举函数具有以下含义:

  • 序列enumFrom e1是列表[e1,e1 + 1,e1 + 2,...].
  • 序列enumFromThen e1 e2是列表[e1,e1 + i,e1 + 2i,...],其中增量ie2 ? e1.增量可以是零或负数.如果增量为零,则所有列表元素都相同.
  • 序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,... e3].如果列表是空的e1 > e3.
  • 序列enumFromThenTo e1 e2 e3是列表[e1,e1 + i,e1 + 2i,... e3],其中增量ie2 ? e1.如果增量为正或零,则列表在下一个元素大于时终止e3; 如果列表是空的e1 > e3.如果增量为负,则列表在下一个元素小于时终止e3; 如果列表是空的e1 < e3.