2011-09-08 12 views
5

Próbowałem rozwiązać problem, który wymagał maksymalnej wartości listy po odwzorowaniu przez funkcję. Lista zawiera się w przedziale od a do b, gdzie a> b lub b> a. Ponieważ Haskell może również definiować malejące listy, pomyślałem, że nie muszę sprawdzać, czy> b i nie było potrzeby przekierowywania granic do b..a. Funkcja wygląda nieco jak poniżej:Dlaczego [1..n] nie jest traktowany tak samo jak [n.1] w Haskell?

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

Ale jeśli lista maleje czyli a> b wtedy Haskell daje mi wyjątek:

Prelude.maximum: empty list 

więc dla jakiegoś powodu zmniejszającej się lista ręce nad pustą listę do maksymalnej funkcji. Dlaczego?

wiem, że maximum jest definiowana w kategoriach foldl1 max i że foldl1 potrzebuje non pustą listę, ale nie wiem, dlaczego lista jest pusta jak [10..1] gdy podał do foldl1.

+2

'[10..1]' jest pusty, cokolwiek z nim zrobisz (nawet jeśli nie przekażesz go 'foldl1'). W ten sposób zdefiniowany jest zakres. –

+2

Możliwy duplikat [Haskell, range downto without step] (http://stackoverflow.com/questions/6972599/haskell-range-downto-without- step). –

+0

Możliwy duplikat http://stackoverflow.com/questions/6806455/haskell-list-range-question oraz – hvr

Odpowiedz

15

[a..b] desugars do enumFromTo a b. W przypadku standardowych typów liczbowych (modulo kilka dziwactw pływających), to dodaje jeden, dopóki nie jesteś >= b. Więc gdzie b < a jest pusta.

Możesz zmienić przyrost, używając następującej składni [a,a'..b], która następnie wykonuje kroki w krokach co a'-a. Tak więc [10,9..1] będzie tym, czego potrzebujesz.

+0

Dzięki, że naprawdę to zrobili. Całkowicie zapomniałem o krokach. – Julian

3

Są obsługiwane dokładnie w ten sam sposób. Zaczynasz od pierwszego powiązania i odliczasz.

Powiązane problemy