7
votes

Mise en œuvre des débutants / apprenants de Foreach à Haskell

J'essaie de mettre en œuvre un morphisme foreach afin de tester ma compréhension de la définition de morphisme et de la correspondance de modèle ... Il me manque évidemment les deux points complètement.

Pourriez-vous me corriger? Je veux que le morphisme foreach prend une liste de a et un morphisme f comme arguments et pour renvoyer la liste de tous les résultats r de f appliqué à tous les éléments a éléments. xxx

Lorsque j'ai compilé, j'ai src \ main.hs: 23: 0: Erreur d'analyse dans le motif


5 commentaires

Au fait: cela existe déjà, s'appelle mapper et défini dans la moitié des lignes.


@delnan: Avec des arguments de cette façon, cela s'appelle pour (et défini en termes de carte probablement).


@Alexandre: Ah oui, ordre d'argument négligé ... La définition serait Flip carte .


Les troisième et quatrième lignes sont inutiles. Le troisième est pris en charge par les deuxième et cinquième lignes, tandis que le quatrième n'aimait tout simplement pas de sens.


@Dan thx pour le remarquant ces incohérences.


4 Réponses :


2
votes

Vous avez oublié de mettre () dans foreach []: xf = [] :( fx) spécifié de manière incorrecte le type de fonction, les suivants doivent maintenant compiler : xxx

et exécuter: xxx


5 commentaires

(a -> r) ici signifie ici que le deuxième argument à foreach est la fonction qui convertit le type A sur type r . Si vous voulez par exemple un type de fonction spécifié comme foreach :: [a] -> (a -> a) -> [a] , vous n'êtes pas en mesure d'évaluer foreach [1. .20] Afficher , parce que Afficher produit une chaîne , et votre fonction prend la valeur d'un type et renvoie la valeur du même type.


: -O Vous êtes bienvenu @Stephane Questions Tagged "Haskell" sont beaucoup plus actives que "Schéma", "Raquette" ou "Erlang". Je pense que j'ai besoin de sortir ici un peu.


La troisième ligne n'est pas nécessaire à la manière ( (x: xs) correspondant (x: []) , liets xs à [] puis se termine lors de la prochaine récursion) à la place.


@Delnan: En effet, je viens de concentrer mon attention sur la syntaxe et la définition de type de fonction qui empêchait la source de compiler.


@Yasir, je déplace le statut de réponse aux réponses de Camcann parce qu'il traite également des incohérences d'écriture foreach [] f = [] et foreach (x: []) f = (FX) : [] mais si je pouvais vérifier deux réponses comme des réponses correctes, je laisserais le vôtre, c'était en premier et reste sur tout plutôt correct.



13
votes

Le problème est syntaxique, dans cette ligne:

map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs


2 commentaires

THX pour toutes les précisions, nommément application de fonction avec une priorité plus élevée.


et bon exemple avec la mise en œuvre de la carte



3
votes

La signature de type que vous donnez est (au moins dans l'opinion de Haskell Compiler) Bogus. C'est une fonction qui prend une liste d'éléments de tout a code> et une valeur de tout em> type f code> et produit une liste de valeurs de Tout type em> type r code>. C'est comme dire "J'ai un groupe d'éléphants et un tournevis. Transformez chaque éléphant en mangue".

Il semble que votre objectif soit de mettre en œuvre la fonction code> Fonction: p>

foreach :: [a] -> (a -> b) -> [b]


2 commentaires

C'est bien de savoir qu'il existe déjà en tant que carte. Je l'ai utilisé dans un tutoriel mais je l'ai oublié ;-), je l'utiliserai maintenant. J'ai également remarqué l'existence du mot-clé Forall en tant que proposition d'achèvement automatique de Leksah, mais je n'ai pas pu trouver sa syntaxe.


@Stephane Rolland: Forall A b. (A -> B) -> [A] -> [B] . Vous aurez besoin d'une extension de langue Haskell pour utiliser cette syntaxe. Voir Types Quantifiés existentiellement quantifiés .



2
votes

Juste un petit addenda. En plus d'une correspondance de motif récursif, on peut également mettre en œuvre foreach à l'aide de la compréhension de la liste: xxx

c'est tout.


0 commentaires