Carte appliqué à plusieurs arguments en Haskell
Est-il un moyen d'utiliser Haskell "carte" ou quelque chose de similaire avec plusieurs arguments?
c'est à dire à trouver la distance entre un point donné (défini comme un n-uplet) et une liste d'autres points:
map distance (-3,-3) buildings
Clairement, cela ne fonctionne pas, parce qu'il essaie de carte "à distance" (-3,-3), où la distance n'attend deux tuples:
let distance pointA pointB = sqrt ( (frst pointB - frst pointA) * (frst pointB - frst pointA) + (scnd pointB - scnd pointA) * (scnd pointB - scnd pointA) )
distance prend deux points comme arguments: l'un est (-3,-3) dans cet exemple, et l'on est sélectionné à partir de la liste des "bâtiments".
(-3,-3) est juste un exemple. Ce devra être une variable; il ne peut pas être codé en dur dans la fonction.
Peut-être que cela fera un peu plus de sens:
buildings = [(3,-2),(2,1),(5,3),(4,3),(4,-1)]
firstDiff pointA pointB = subtract ( fst pointA ) ( fst pointB )
secondDiff pointA pointB = subtract ( snd pointA ) ( snd pointB )
distance pointA pointB = sqrt ( (firstDiff pointA pointB) * (firstDiff pointA pointB) + (secondDiff pointA pointB) * (secondDiff pointA pointB))
--- What I need to happen here is a list "score" to be created by taking all distances from a point in a list lPoints to a point in list buildings.
OriginalL'auteur Jason B | 2010-03-01
Vous devez vous connecter pour publier un commentaire.
vous voulez:
qui est
de toute évidence, "carte (distance firstpoint) bâtiments", ne serait-il pas? Ou pour dire les choses crûment: "frombuilding des bâtiments = map (distance point) les bâtiments"
Bien sûr, vous pouvez remplacer (-3, -3) avec une variable.
Mon erreur, il s'avère un bug dans ma fonction de distance a été de lancer une erreur; fixation-il permis que cela fonctionne assez bien. Merci!
vous pourriez aussi avoir besoin de jeter un fromIntegral dans: distance pointA pointB = (sqrt.fromIntegral) ( (frst pointB - frst pointA) * (frst ...
OriginalL'auteur ja.
OriginalL'auteur ephemient
Après avoir vu le commentaire sur ja réponse je devine que vous souhaitez utiliser
zipWith
La la documentation états:
Dans votre code ci-dessus, cela pourrait ressembler à:
OriginalL'auteur Bas Bossink
func1 est la fonction que vous avez décrit, alors que func2 est similaire, mais plusieurs points de départ au lieu d'un seul et trouve la distance entre chaque combinaison avec les points de fin.
OriginalL'auteur Thomas Eding
La formule de la distance est simple:
Notez l'utilisation de pattern matching pour décomposer les arguments plutôt que simplement le code avec
fst
etsnd
.Distances respectives à partir d'un point donné à tous les points de la liste est ensuite
Bien que les arguments semblent manquer, c'est connu dans le langage Haskell comme l'application partielle. Dans
distanceFrom
, nous avons deux d'entre eux:distance p
est une fonction en un point dont la valeur est le point de distance dep
map (distance p)
est une fonction d'une liste de points dont la valeur est de ces points de distances respectives dep
Essayer de concevoir votre Haskell fonctions pour l'application partielle pour le rendre facile à combiner des petites fonctions en plus gros. Comme indiqué dans ephemient réponse, vous pourriez faire un pas de plus pour obtenir pointfree définition (pas explicite arguments)—plus d'élégance, un style avancé.
La distance de chaque point dans
buildings
de tous les points delPoints
est alorsPar exemple, de faire
lPoints
etbuildings
l'égalité, la sortie estMais c'est un peu ennuyeux dans ce cas particulier, compte tenu de toutes les redondances. Au lieu d'imprimer le stricte triangle supérieur, utilisez
De sortie:
"Dans ce cas" qui était dans ma tête de ne pas le faire à ma réponse. Merci et édité!
OriginalL'auteur Greg Bacon