我试图在Monad.Reader Issue 8中理解Brent Yorgey的多分区分区算法。自从我写了任何Haskell以来已经有很长一段时间了,我想我甚至忘记了基本的东西。我坚持这个清单中的代码:
我应该告诉您Vec
是[Int]
的类型别名,而<|=
表示向量的成分比较:
函数withinFromTo
应该在<= m
和s
(包括)之间按字典顺序返回非负向量的列表e
。
我被困在了一线:
[x:xs | x <- [start, (start-1)..end]
[start, (start-1)..end]
是什么意思?我前往tryhaskell.org并尝试评估[3,2..7]
,但它只是给了我[]
。
我知道这看起来似乎是一个愚蠢的问题,但我无法通过谷歌搜索找到任何内容,我觉得我可以在浏览文档之前阅读文档很长时间。
感谢您的帮助。
答案 0 :(得分:6)
[a, b .. c]
语法旨在生成以a
和b
开头的算术级数,并一直持续到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
其中
enumFrom
,enumFromThen
,enumFromTo
和enumFromThenTo
是Enum
中定义的类Prelude
中的类方法(请参阅图6.1)。对于类型
Int
和Integer
,枚举函数具有以下含义:
- 序列
enumFrom e1
是列表[e1,e1 + 1,e1 + 2,...]。- 序列
enumFromThen e1 e2
是列表[e1,e1 + i,e1 + 2i,...],其中增量i
为e2 − e1
。增量可以是零或负数。如果增量为零,则所有列表元素都相同。- 序列
,该列表为空enumFromTo e1 e3
是列表[e1,e1 + 1,e1 + 2,... e3]。如果e1 > e3
。- 序列
,则列表为空enumFromThenTo e1 e2 e3
是列表[e1,e1 + i,e1 + 2i,... e3],其中增量i
为e2 − e1
。如果增量为正或零,则当下一个元素大于e3
时,列表终止;如果e1 > e3
,则列表为空。如果增量为负,则当下一个元素小于e3
时,列表终止;如果e1 < e3
。