2009-09-11 13 views
9

Próbujesz wyczuć haskell. Jestem doświadczonym programistą z PHP, JAVA, VB i wieloma innymi językami, ale znajduję nieco trudniejsze do naśladowania haskell. Czy ktoś może dać mi tłumaczenie angielskie dla następujących funkcji Haskell, żeby mnie zaczęło ...Haskell - Programowanie funkcji Pomoc

quicksort []  = [] 
quicksort (x:xs) = quicksort [y | y <- xs, y<x ] 
        ++ [x] 
        ++ quicksort [y | y <- xs, y>=x] 

Przykładem tłumaczeniu angielskim jest w komentarzach poniżej:

// --- FOR_LOOP -> 
// --- $abc goes from 1 to 10 -> 
// --- If $abc is even - print $abc is even -> 
// --- else if $abc is odd - print $abc is odd -> 
// --- END_FOR_LOOP 

for($abc = 1 ; $abc <= 10 ; $abc++){ 

    if($abc % 2 == 0){ 
    echo $abc . " is even"; 
    } 
    else{ 
    echo $abc . " is odd"; 
    } 
} 

Pierwsza linia jest wystarczająco prosta, czytając: "Funkcja quicksort na pustej liście daje w rezultacie pustą listę" ... Jeśli możesz przetłumaczyć pozostałą część haskell na angielski t kapelusz byłby bardzo pomocny.

+0

naprawdę cieszył pracy z Haskell w college'u - z jakiegoś powodu kliknął ze mną . Dobre wspomnienia ... – Mayo

+0

Dobre odpowiedzi chłopaki - to dokładnie to, czego szukałem - okrzyki! –

+0

Dodatkowe pytanie dla innych: jaka jest największa słabość tego algorytmu? –

Odpowiedz

13

Wynikiem szybkiego zapisania pustej listy jest pusta lista.

Wynikiem quicksorting niepusty listy, gdzie połączyć pierwszy element listy x a pozostałe elementy xs jest: wynik quicksorting wszystkie elementy xs, które są mniejsze niż x (*), a następnie przez x, a następnie wynik quicksorting wszystkich elementów xs, które są większe niż x.

(*) Aby opracować nieco: [y | y <- xs, y<x ] można odczytać jako "listę wszystkich y, gdzie y jest w xs i y<x".

0

To nie odpowiada bezpośrednio na twoje pytanie, ale hoogle może pomóc ci w nauce, możesz użyć jej do przeszukania standardowych bibliotek api poprzez nazwę funkcji lub przybliżony podpis typu.

Oto przykłady wyszukiwanych haseł, które wspiera:

map 
(a -> b) -> [a] -> [b]` 
Ord a => [a] -> [a] 
Data.Map.insert 
4

nie zostało to zrobione od uczelni ...

To rekurencyjne - pierwsza linia jest w przypadku pustego zestawu.

quicksort []  = [] 

Kolejne kilka linii działa na niepustym zbiorze. Składnia (x: xs) dzieli je na pojedynczy element (x) i pozostałe elementy (xs).

quicksort (x:xs) = quicksort [y | y <- xs, y<x ] 
    ++ [x] 
    ++ quicksort [y | y <- xs, y>=x] 

Pierwsza linia, quicksort [y | y < - xs, y < x], wywołuje quicksort przeciwko zestawowi wszystkich elementów od xs, które są mniejsze niż x (tj. każdy y od xs, który jest mniejszy niż x). Jeśli xs jest zbiorem pustym, to quicksort [] zwróci [].

Środkowa linia to po prostu zestaw zawierający x.

Ostatnia linia, quicksort [y | y < - xs, y > = x], wywołuje quicksort przeciwko zestawowi wszystkich elementów od xs, które są większe lub równe x (tj. każdy y od xs, który jest większy lub równy x). Jeśli xs jest zbiorem pustym, to quicksort [] zwróci [].

Rezultatem końcowym jest uporządkowany zestaw.

+2

"Wynik końcowy jest uporządkowanym zestawem." - To nie jest zestaw, to lista. 'quicksort [1,2,3,1,2,3]' zwróci '[1,1,2,2,3,3]'. Zwróć uwagę na duplikaty wpisów. – sepp2k

2

Jest to język deklaratywny, więc po prostu czytasz to, co widzisz. sepp2k ma dobry przykład powyżej.

2

W przypadku problem był w-znajomości listowych, oto niektóre alternatywne wersje, które są mniej więcej takie same:

quicksort []  = [] 
quicksort (x:xs) = 
    quicksort (filter (< x) xs) ++ 
    [x] ++ 
    quicksort (filter (>= x) xs) 

quicksort []  = [] 
quicksort (x:xs) = 
    quicksort smaller ++ [x] ++ quicksort bigger 
    where 
    (smaller, bigger) = partition (< x) xs