Kopiuj
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
Zrozumiała i prosta, niestety
, tzn. wolna.
Kopiuj
reverse = aux [] where
aux ys [] = ys
aux ys (x:xs) = aux (x:ys) xs
Czym jest aux
- aux - funkcja pomocnicza.
Równoważnie (poza wprowadzeniem reverse' poziom wyżej dla czytelności
):
Kopiuj
reverse = reverse' []
reverse' ys [] = ys
reverse' ys (x:xs) = reverse' (x:ys) xs
po co jest słówko where i dlaczego wywołujemy to w taki sposób: reverse [1,2,3]
- nie rozumiem pytania, do czego służy where chyba wiesz. Tak samo, jak inaczej by to miało być wywoływane.
Ad. dlaczego tak pisać - taka wersja jest szybka (i nie przesadzaj z tą nieczytelnością, dość idiomatyczna - to dość typowy wzorzec
).
Ad. dlaczego/jak to działa - pierwszy argument reverse' to już odwrócony fragment listy
- rozpisz sobie dla kilku przykładów:
Kopiuj
reverse [1, 2, 3, 4] =
reverse' [] [1, 2, 3, 4] =
reverse' [1] [2, 3, 4] =
reverse' [2, 1], [3, 4] =
reverse' [3, 2, 1] [4] =
reverse' [4, 3, 2, 1] =
[4, 3, 2, 1]
wieloargumentowe
zwracają kolejną funkcję która dostaje drugi argument itp.