2012-02-16 5 views
0

Y at-il une fonction Haskell qui peut prendre une liste, par exemple des doubles, comme ceci:Retournez les indices "ordering" de la liste?

[0.5, 0.6, 0.1, 0.7] 

et retourner une liste d'entiers qui représentent les indices des éléments dans l'ordre. Dans le cas ci-dessus, il serait:

[2, 0, 1, 3] 

NOTE: Ce que je suis en train de réaliser est une fonction (appelons-le consistent) qui permet de comparer deux listes de doubles et indiquer à l'utilisateur si l'ordre relatif des listes est cohérente:

> consistent [1.0, 2.0, 3.0] [2.1 3.5 4.6] 
True 
> consistent [1.0, 2.0, 3.0] [3.0, 2.0, 1.0] 
False 
+1

L'opérateur de correction APL. Oh, ce n'est pas Haskell. :) – augustss

Répondre

2

Vous pouvez zip la liste avec [0..] coupler chaque élément avec son index. Ensuite, vous pouvez trier cette liste et utiliser la carte pour obtenir le deuxième élément de chaque paire (l'index).

+0

Ils sont? cohérent [2, 4, 6, 5] [2, 4, 6, 3] est faux, mais je pense que la liste de comparaison dont vous parlez est la même? [2,4,6,5] -> [GT, GT, LT] et [2,4,6,3] -> [GT, GT, LT]. Je ne pense pas que cela puisse être fait en temps linéaire. –

+0

@Doug Oups. Tu as raison. Mon idée ne marche pas - ça marche si bien avec les exemples que j'ai essayés dans ma tête :-(Je l'ai supprimé de ma réponse – sepp2k

+0

Merci, l'idée du zip est géniale ... mais ma fonction consistante a une signature vraiment poilue .. 'coherent :: [[Double]] -> Bool'need coffee – drozzy

0

Je pense que vous pourriez faire quelque chose comme ça aussi:

swap (a, b) = (b, a) 

consistent a b = sort (zip a b) == map swap $ sort (zip b a) 

Je n'ai jamais sérieusement Haskell codé, de sorte que la syntaxe est juste quelque chose de vaguement semblable à ce que je me souviens après avoir lu « vous apprendre Haskell ..." il y a des mois.

+0

Je ne suis pas convaincu que cela fonctionne. L'ordre que vous obtenez en triant 'a' n'est pas nécessairement le même que celui que vous obtenez en triant' zip a b'. Parce que lorsque les éléments sont égaux dans 'a', le premier conserve l'ordre d'origine (le tri est stable), tandis que le second utilise' b' pour déterminer l'ordre de ces éléments. – augustss

+0

Je pense que je comprends votre point de vue, mais si cela se produit, cela devrait impliquer que la commande dans B n'était pas cohérente après tout, n'est-ce pas? En effet, la définition de la méthode "consistante" varie si la méthode de tri est stable ou non: -/ – fortran

+2

@fortran, le problème n'est que lorsque deux éléments inégaux (dans le sens le plus pur) se comparent égaux (selon le '(= =) 'ou fonctions' compare'). Si les éléments qui se comparent égaux sont toujours indiscernables, alors cette implémentation est correcte. – luqui