我试图解决一个问题,该问题在被函数映射后需要列表的最大值.该列表是从a到b的范围,其中a> b或b> a.因为Haskell也可以定义递减列表,我认为我不需要检查是否a> b并且不需要将边界翻转为b..a.该函数看起来有点像这样:
f a b = maximum . map aFunction $ [a..b]
Run Code Online (Sandbox Code Playgroud)
但是如果列表正在减少,即a> b,那么Haskell给了我一个例外:
Prelude.maximum: empty list
Run Code Online (Sandbox Code Playgroud)
因此,由于某种原因,递减列表将空列表移交给最大函数.这是为什么?
我知道这maximum是用a来定义的,foldl1 max并且foldl1需要一个非空的列表,但我不知道为什么列表[10..1]在交给a时是空的foldl1.
scl*_*clv 15
[a..b]des to to to enumFromTo a b.对于标准数字类型(模拟浮动的几个怪癖),这将继续添加一个,直到你>= b.所以b < a这是空的.
您可以使用以下语法更改增量[a,a'..b],然后以增量为单位执行步骤a'-a.那[10,9..1]将是你想要的.
这是因为在Haskell报告算术序列中定义序列的方式 :
[e1..e3] = enumFromTo e1 e3
序列enumFromTo e1 e3是列表[e1,e1 + 1,e1 + 2,... e3].如果e1> e3,则列表为空.
(重点补充).