À l'aide de la carte à remplacer des éléments d'une liste avec (x-y)*(x-y), où y est l'élément initial
J'ai un peu de devoirs à faire et je suis un débutant complet à Haskell. La question que je vais avoir des ennuis avec, est d'écrire une fonction qui, lorsqu'étant donné un entier x
et d'une liste d'entiers appliquer (x-y)*(x-y)
à chaque élément de la liste et de sortie de la nouvelle liste, avec y
à chaque élément de la liste d'entrée.
J'ai une idée très approximative, je vais avoir à utiliser le map
fonction, mais je ne suis pas sûr de la manière de procéder.
J'ai été en regardant des exemples pour ajuster chaque élément dans une liste et de comprendre comment cela fonctionne, mais comment je pourrais mettre en œuvre l' (x-y)*(x-y)
avec y
être l'élément courant complètement me déroute.
squares :: [Int] -> [Int]
squares (x:xs) = x * x : squares xs
squares [] = []
la question exacte que j'ai été ensemble est,
Écrire une fonction
rela
qui prend comme arguments un entierx
et d'une liste d'entiers. Elle renvoie une liste similaire, mais où chaque élémenty
a été remplacé par(x-y)*(x-y)
, par exempleMain> rela 2 [3,5,7] [1,9,25]
J'ai réussi à le faire fonctionner après la lecture à travers des livres, mais le code que j'ai fait, perd le premier élément dans la liste. Aucune explication pourquoi?
equation1 :: Int -> Int -> Int
equation1 x y = (x-y)*(x-y)
rela :: Int -> [Int] -> [Int]
rela x [] =[]
rela x (y:ys) = [ equation1 x y | y <- ys ]
OriginalL'auteur blane clorley | 2012-04-14
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devriez probablement de créer une fonction qui fait ce que vous voulez.
par exemple
Maintenant, chaque fois que vous créez une fonction en Haskell avec plusieurs paramètres, il fait "caris" la fonction, ce qui signifie que vous obtenez une nouvelle fonction lorsque vous appliquez le premier argument.
Ainsi, vous souhaitez obtenir une nouvelle fonction en faisant cela,
L'expression
f 5
est en fait une fonctionEt vous pouvez appliquer un certain nombre de " g " et x sera toujours '5'
Donc, si nous voulons créer une fonction qui prend deux paramètres, 'x' et 'y', et s'applique
(x-y)*(x-y)
à une liste où y est l'élément courant, alors tout ce que nous devons faire est la suivante:Que vous pouvez utiliser en appelant
squareDifference 5
ou tout autre nombre comme argumentPlus générales version vous permettra de passer d'une liste ainsi
Que vous appelleriez en faisant
squareDifference 3 [1,2,3]
Ce que vous voulez faire est d'écrire une fonction
map
, qui obtient une fonctionf :: a → b
en tant que paramètre et l'applique à tous les éléments de la liste, de sorte quemap f [x₀, x₁, x₂, x₃ ..] ≡ [f x₀, f x₁, f x₂, f x₃ ..]
. Alors que vous venez de créer application partielle de la fonction (voir ci-dessus) et d'appelermap
avec elle. La signature d'un type derela
correspond àconcatMap
et ce n'est pas vraiment ce dont vous avez besoin dans ce cas.Encore perdu, Si je suis d'être brutalement honnête, j'ai besoin de dire en termes simples, je n'ai jamais fait un peu de programmation et c'était il y a des années. Je pensais que la carte a été prédéfini? si j'ai créer ma propre fonction map comment pourrais-je faire obtenir la fonction?
Mise à jour de ma réponse. Est-ce que c'est?
Vous avez déjà
f x y = (x - y)^2
, qui est une fonction de type (pour des raisons de simplicité)Int → Int → Int
,map
s'attend à une fonction de typea → b
pour certainsa
etb
, une liste de valeurs de typea
(c'est à dire[a]
) et retourne une liste deb
s. Puisque vous commencez avec[Int]
et souhaitez retrouver avec[Int]
trop, vous devez fournir une fonctionInt → Int
. Si vous n'appliquer qu'un seul argument àf
(commef 5
), vous avez une fonctionInt → Int
avec le premier argument fixe (dans cet exemple 5).OriginalL'auteur Wes
ne vous comprends lambda fonctions?
est ce que vous avez besoin.
nourrissage, c'est encore mieux, mais pas aussi simple.
edit:
plus conceptuel...
carte effectue une itération vers le bas d'une liste, l'application d'une fonction.
utilise le nourrissage de la technique mentionnée ci-dessus. vous pouvez également:
pour accomplir la même chose.
d'attente dans le terminal ou dans ghci?
à l'aide de câlins dans le terminal
... vous disposez d'un code
repa x xs = map (lambda function) xs
J'ai juste couru f x y = (x-y)*(x-y) repa x xs = map (f) xs et cela n'a pas fonctionné ai-je pu être assez audacieux pour demander à vous pour la réponse complète à la question ci-dessus et de me parler à travers elle? juste mon professeur est absent toute la semaine et les affectations en raison en milieu de semaine et j'ai d'autres questions à faire et c'est la base
OriginalL'auteur bbrittain
Exemple Simple:
Ou pourriez-vous voulez toutes les perversions? -) Ici, vous êtes à Applicatifs:
OriginalL'auteur Danil Onishchenko
Bonjour je suppose que vous voulez dire ceci:
OriginalL'auteur Zacharie 007