Étant donné l'expression a!!i
Haskell en déduira que a
est une liste (c'est-à-dire a::[a]
). Étant donné l'expression a<-[1..3]
Haskell en déduira que a
aura le type Num a => a
(parce que vous dessinez a
à partir d'une liste de Num a => a
). En essayant d'unifier ces types, Haskell conclut que a
doit effectivement être de type Num a => [a]
.
L'essentiel est que cela n'a pas de sens de traiter a
comme une liste dans un contexte et comme un élément d'une liste de nombres dans un autre contexte.
EDIT
Je pense que vous pourriez faire ce que vous voulez avec quelque chose comme ça :
f xs = map fst . filter (uncurry (>)) $ (xs `zip` [0..])
L'expression xs `zip` [0..]
crée une liste de paires, où la première valeur de chaque paire est tirée de xs
et la deuxième valeur de [0..]
(une liste infinie partant de 0). Cela sert à associer un indice à chaque valeur dans xs
. L'expression uncurry (>)
convertit le <
en une fonction qui fonctionne sur les paires. Ainsi, l'expression filter (uncurry (>))
filtre une liste de paires en ne retenant que les éléments dont la première valeur est supérieure à la seconde. Enfin, map fst
applique le fst
à chaque paire de valeurs et renvoie le résultat sous forme de liste (la fonction fst
renvoie la première valeur d'une paire).
EDIT 2
Écrire du code inutile est amusant, et donc je vous le donne :
f = map snd . filter (uncurry (<)) . zip [0..]