2011-09-08 58 views
5

我试图解决一个问题,需要通过函数映射后的列表的最大值。该列表是从a到b的范围,其中a> b或b> a。因为Haskell也可以定义递减列表,我认为我不需要检查a> b并且不需要将界限翻转到b..a。该功能看起来有点像这样:为什么[1..n]在Haskell中的处理方式与[n..1]不同?

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

但如果列表递减,即A> B,然后哈斯克尔给我一个例外:

Prelude.maximum: empty list 

所以出于某种原因减少列表的双手在一个空列表到最大的功能。这是为什么?

我知道maximumfoldl1 max来定义和foldl1需要一个非空列表,但我不知道为什么当交给一个foldl1[10..1]列表是空的。

+2

不管你用它做什么'[10..1]'都是空的(即使你不把它交给'foldl1')。这就是范围的定义。 –

+2

[Haskell,range downto without step]可能重复(http://stackoverflow.com/questions/6972599/haskell-range-downto-without-step)。 –

+0

http://stackoverflow.com/questions/6806455/haskell-list-range-question可能的重复以及 – hvr

回答

15

[a..b] desugars到enumFromTo a b。对于标准的数字类型(以浮点数为模数),这将继续增加一个,直到你是>= b。那么b < a这是空的。

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

+0

谢谢,真的这样做。我完全忘记了踏步。 – Julian

3

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

相关问题