如果我进入[5..1]Haskell控制台,它将返回[],而我却期望如此[5, 4, 3, 2, 1]。
通常,[a..b] = []如果a > b。为什么?
Dan*_*ner 15
该报告涵盖了详细信息。在3.10节中:
算术序列满足以下身份:
Run Code Online (Sandbox Code Playgroud)[ e1..e3 ] = enumFromTo e1 e3
在6.3.4节中:
对于类型
Int和Integer,枚举函数具有以下含义:
- 序列
enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,…e3]。如果,该列表为空e1 > e3。对于
Float和Double,族的语义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-您无需首先确定哪个x或y更大。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]。