2009-09-11 4 views
9

Essayer de ressentir le haschell. Suis un programmeur chevronné avec PHP, JAVA, VB et beaucoup d'autres langues, mais je trouve haskell un peu plus difficile à suivre. Quelqu'un peut-il me donner une traduction pour la fonction haskell suivante, pour me lance ...Haskell - Aide à la programmation fonctionnelle

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

Un exemple de traduction anglaise est dans les commentaires ci-dessous:

// --- 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"; 
    } 
} 

La première ligne est assez simple, en lisant: "La fonction quicksort sur une liste vide donne comme résultat une liste vide" ... Si vous pouvez traduire le reste du haskell en anglais t Le chapeau serait très utile.

+0

J'ai vraiment apprécié travailler avec Haskell à l'université - pour une raison quelconque, il a cliqué avec moi . Bons souvenirs ... – Mayo

+0

Belles réponses, les gars - c'est exactement ce que je cherchais - bravo! –

+0

Une question supplémentaire pour les autres: quelle est la faiblesse majeure de cet algorithme? –

Répondre

13

Le résultat de quicksorting la liste vide est la liste vide.

Le résultat de quicksorting une liste non vide, où l'on appelle le premier élément de la liste x et les autres éléments xs est: Le résultat de quicksorting tous les éléments de xs qui sont plus petits que x (*), suivi par x, suivi du résultat de quicksorting tous les éléments de xs supérieurs à x.

(*) Pour élaborer un peu: [y | y <- xs, y<x ] peut être lu comme "la liste de tous y où y est en xs et y<x".

0

Cela ne répond pas directement à votre question, mais hoogle peut aider votre apprentissage en général, vous pouvez l'utiliser pour rechercher les bibliothèques d'API standard par le nom de la fonction, ou par la signature de type approximatif.

est ici des exemples des termes de recherche qu'il soutient:

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

ont pas fait depuis le collège ...

Il est récursive - la première ligne est le cas pour un ensemble vide.

quicksort []  = [] 

Les lignes suivantes fonctionnent sur un ensemble non vide. La syntaxe (x: xs) la divise en un seul élément (x) et les éléments restants (xs).

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

La première ligne, quicksort [y | y < - xs, y < x], appelle quicksort contre l'ensemble de tous les éléments de xs inférieur à x (c'est-à-dire chaque y de xs inférieur à x). Si xs est l'ensemble vide, alors quicksort [] retournera [].

La ligne médiane est simplement l'ensemble contenant x.

La dernière ligne, quicksort [y | y < - xs, y > = x], appelle quicksort contre l'ensemble de tous les éléments de xs qui sont supérieurs ou égaux à x (c'est-à-dire chaque y de xs supérieur ou égal à x). Si xs est l'ensemble vide, alors quicksort [] retournera [].

Le résultat final est un ensemble ordonné.

+2

"Le résultat final est un ensemble ordonné." - Ce n'est pas un ensemble, c'est une liste. 'quicksort [1,2,3,1,2,3]' retournera '[1,1,2,2,3,3]'. Notez les entrées en double. – sepp2k

2

C'est un langage déclaratif, donc vous venez de lire ce que vous voyez. sepp2k fait un bon exemple ci-dessus.

2

Dans le cas où votre problème est en familiarité avec compréhensions de liste, voici quelques versions alternatives qui sont plus ou moins le même:

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 
Questions connexes