2011-09-08 23 views
5

Estaba tratando de resolver un problema que requería el valor máximo de una lista después de ser mapeada por una función. La lista es un rango de a a b donde a> b o b> a. Debido a que Haskell también puede definir listas decrecientes, pensé que no era necesario verificar si a> b y no había necesidad de voltear los límites a b..a. La función se ve algo como esto:¿Por qué [1..n] no se maneja de la misma manera que [n..1] en Haskell?

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

Pero si la lista está disminuyendo es decir, a> b entonces Haskell me da una excepción:

Prelude.maximum: empty list 

Así que por alguna razón una lista que disminuyen las manos sobre una lista vacía a la función máxima. ¿Porqué es eso?

sé que maximum se define en términos de una foldl1 max y que foldl1 necesita una lista no vacía, pero yo no sé por qué una lista como [10..1] está vacía cuando se entregó a un foldl1.

+2

'[10..1]' está vacío haga lo que haga con él (incluso si no lo pasa a 'foldl1'). Así es como se define el rango. –

+2

Posible duplicado de [Haskell, rango hacia abajo sin paso] (http://stackoverflow.com/questions/6972599/haskell-range-downto-without-step). –

+0

Posible duplicado de http://stackoverflow.com/questions/6806455/haskell-list-range-question también – hvr

Respuesta

15

[a..b] desugars a enumFromTo a b. Para los tipos numéricos estándar (módulo un par de caprichos para flotar), esto sigue agregando uno hasta que esté >= b. Entonces, donde b < a esto está vacío.

Puede cambiar el incremento usando la siguiente sintaxis [a,a'..b] que luego toma medidas en incrementos de a'-a. Entonces [10,9..1] será lo que quieras.

+0

Gracias que realmente lo hizo. Me olvidé por completo del paso. – Julian

3

Se manejan exactamente de la misma manera. Comienzas desde el primer límite y cuentas hacia arriba.

Cuestiones relacionadas