我试图解决一个问题,该问题在被函数映射后需要列表的最大值。该列表是从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
时为空。
答案 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)
它们的处理方式完全相同。你从第一个绑定开始计数。