减少Haskell中的范围

时间:2011-07-24 11:18:54

标签: list haskell

我对Haskell很新。有人可以解释为什么定义这样的列表会返回一个空列表

ghci>  let myList = [10..1]
ghci>  myList
[]

然而,这可以正常工作。

ghci>  let myList = [10, 9..1]
ghci>  myList
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

4 个答案:

答案 0 :(得分:36)

基本上,因为[10..1]被翻译为enumFromTo 10 1,它本身具有创建列表的语义,方法是将所有小于1的元素从向上计数(步长) +1)来自(包括)10

[10, 9..1]被转换为enumFromToThen 10 9 1,明确指出计数步长为9-10,即-1(硬编码为+1对于enumFromTo

更准确的规范可以在Haskell报告(6.3.4 Enum类)中找到:

enumFrom       :: a -> [a]            -- [n..]
enumFromThen   :: a -> a -> [a]       -- [n,n'..]
enumFromTo     :: a -> a -> [a]       -- [n..m]
enumFromThenTo :: a -> a -> a -> [a]  -- [n,n'..m]
  

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

     
      
  • 序列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],其中增量ie2-e1。如果增量为正或零,则当下一个元素大于e3时,列表终止;如果e1 > e3,则列表为空。如果增量为负,则当下一个元素小于e3时,列表终止;如果e1 < e3

  • ,则列表为空   

答案 1 :(得分:11)

算术序列表示法只是Enum类函数的语法糖。

[a..]     = enumFrom a
[a..b]    = enumFromTo a b
[a, b..]  = enumFromThen a b
[a, b..c] = enumFromThenTo a b c

至于为何他们没有被定义为自动撤销,我只能推测,但这里有一些可能的原因:

  • 如果在其他地方定义了ab,则很难一目了然地指出[a..b]的方向。

  • 它有更好的数学属性来推理。您不必为序列反转时添加特殊情况。

答案 2 :(得分:2)

如果您想生成从DOMImplementation domImpl = doc.getImplementation(); DocumentType doctype = domImpl.createDocumentType(""); doc.appendChild(doctype); a的列表,无论是否b,您都可以使用以下内容:

a < b

答案 3 :(得分:1)

对于新手。

要列出从 20 到 1 的所有数字,您不能只做

[20..1]

你必须这样指定:

[20,19..1]