Haskell List理解语法

时间:2015-10-23 01:49:06

标签: haskell list-comprehension

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

enter image description here

我应该告诉您Vec[Int]的类型别名,而<|=表示向量的成分比较:

enter image description here

函数withinFromTo应该在<= ms(包括)之间按字典顺序返回非负向量的列表e

我被困在了一线:

[x:xs | x <- [start, (start-1)..end] 

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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]

Arithmetic Sequences上的Haskell报告部分以及the Enum type class部分提供了完整的详细信息:

  

算术序列满足这些身份:

[ e1.. ]      = enumFrom e1
[ e1,e2.. ]   = enumFromThen e1 e2
[ e1..e3 ]    = enumFromTo e1 e3
[ e1,e2..e3 ] = enumFromThenTo e1 e2 e3
     

其中enumFromenumFromThenenumFromToenumFromThenToEnum中定义的类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
  • ,则列表为空