为什么[1..n]的处理方式与Haskell中的[n..1]不同?

时间:2011-09-08 13:54:41

标签: list haskell fold

我试图解决一个问题,该问题在被函数映射后需要列表的最大值。该列表是从a到b的范围,其中a> b或b> a。因为Haskell也可以定义递减列表,我认为我不需要检查是否> b并且不需要将边界翻转为b..a。该函数看起来像这样:

f a b = maximum . map aFunction $ [a..b]

但是如果列表正在减少,即a> b,那么Haskell给了我一个例外:

Prelude.maximum: empty list

因此,由于某种原因,递减列表将空列表移交给最大函数。那是为什么?

我知道maximum是根据foldl1 max定义的,foldl1需要非空列表,但我不知道为什么像[10..1]这样的列表是交给foldl1时为空。

3 个答案:

答案 0 :(得分:15)

[a..b]去了enumFromTo a b。对于标准数字类型(模拟浮动的几个怪癖),这将继续添加一个,直到你>= b。所以b < a这是空的。

您可以使用以下语法[a,a'..b]更改增量,然后以a'-a为增量执行步骤。所以[10,9..1]将是你想要的。

答案 1 :(得分:5)

这是因为在Haskell Report Arithmetic Sequences 中定义序列的方式:

  

[e1..e3] = enumFromTo e1 e3

Haskell Report The Enum Class

  

序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,... e3]。 如果e1&gt;该列表为空e3。

(重点补充)。

答案 2 :(得分:3)

它们的处理方式完全相同。你从第一个绑定开始计数。