为什么当a> b时[a..b]为空列表?

Hum*_*pty 3 haskell

如果我进入[5..1]Haskell控制台,它将返回[],而我却期望如此[5, 4, 3, 2, 1]

通常,[a..b] = []如果a > b。为什么?

Dan*_*ner 15

该报告涵盖了详细信息。在3.10节中

算术序列满足以下身份:

[ e1..e3 ]    =   enumFromTo e1 e3
Run Code Online (Sandbox Code Playgroud)

6.3.4节中

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

  • 序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,…e3]。如果,该列表为空e1 > e3

对于FloatDouble,族的语义enumFrom由上述规则给出Int,除了当元素变得大于e3 + i?2正数递增i或元素小于e3 + i?2负数时列表终止i

然后,下一个问题是:“为什么要以这种方式指定报告?”。我认为答案是,对于数学家来说,这种选择是很自然的,大多数原始委员会在某种程度上都是如此。它还具有许多不错的属性:

  • 如果[x..y]Ñ值,则[x..y-1][x+1..y]具有n-1个值(其中在n-1个,减法饱和为0,一个啊哈自然的选择)。
  • 检查特定元素是否在范围内[x..y]仅需要检查它是否大于x和小于y-您无需首先确定哪个xy更大。
  • 它可以防止某些类的意外的一次性错误:如果要在之后取下一个n> = 0元素x,则可以编写[x..x+n-1]。如果选择其他规则,则[x..y]可能意味着[y,y+1,...,x]如果y较小,则无法使用[_.._]语法创建空列表,因此无法采用统一的方法来获取下n个元素。一个人不得不写起来比较麻烦if n>0 then [x..x+n-1] else []; 忘记写这张支票非常容易。

如果您想要列表[5,4,3,2,1],可以通过指定一个明确的第二步来实现,如中所示[5,4..1]