3 votes

Qu'est-ce qui ne va pas avec ce code de compréhension de la liste ?

Mon objectif est de lister tous les éléments du tableau. a dont les valeurs sont supérieures à leurs positions d'index. J'ai écrit un code Haskell comme ceci.

[a|i<-[0..2],a<-[1..3],a!!i>i]

Lors du test sur l'invite ghci prelude, j'obtiens le message d'erreur suivant que je ne parviens pas à comprendre.

No instance for (Num [a]) arising from the literal 3 at <interactive>:1:20 Possible fix: add an instance declaration for (Num [a])

10voto

Daniel Pratt Points 8151

É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..]

1voto

Landei Points 30509
import Data.Maybe
import Control.Monad

f = catMaybes . zipWith (mfilter.(<)) [0..] . map Just

Avertissement : Le code donné n'a pas été relu et peut avoir été fait en dehors de la sobriété. L'auteur a peu de souvenirs de ce dont il s'agit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X