/ / compter les résultats d’une matrice définie - haskell, matrice, incrément

compter les résultats d'une matrice définie - haskell, matrice, incrément

Donc, je suis très nouveau en programmation et Haskell estLa première langue que je suis en train d’apprendre. Le problème que je rencontre est probablement très simple, mais je ne peux tout simplement pas trouver de réponse, peu importe combien de fois je cherche.

Donc, fondamentalement, ce que j'ai est une matrice 3x3 et chaqueLe nombre d'éléments est compris entre 1 et 3. Cette matrice est prédéfinie. Il ne me reste plus qu'à créer une fonction qui, lorsque je saisis 1, 2 ou 3, indique le nombre d'éléments de cette matrice avec cette valeur. J’ai essayé avec différentes choses mais aucune d’entre elles ne semble être autorisée. Par exemple, j’ai défini 3 variables pour chacun des nombres possibles et essayé de les définir par

value w =
let a=0
b=0
c=0
in
if matrix 1 1==1 then a=a+1 else if matrix 1 1==2 then b=b+1

etc. etc. pour chaque combinaison et domaine.

<- en ignorant la mauvaise syntaxe que je suis vraimentmon plus gros problème est le fait que je ne puisse pas utiliser un "=" avec "si, alors". Existe-t-il un moyen de contourner ou peut-être d'utiliser des "données stockées" à partir de fonctions précédemment définies?

J'espère que ma question est un peu claire, car je dis que je ne travaille à la programmation que depuis 2 jours et que je n'arrive pas à trouver le moyen de faire en sorte que cela fonctionne!

Réponses:

1 pour la réponse № 1

Par défaut, Haskell n’utilise pas de variables pouvant être mises à jour. Vous créez plutôt une nouvelle valeur et vous la transmettez ailleurs (par exemple, vous la retournez d’une fonction, vous l’ajoutez à une liste, etc.).

J'aborderais ceci en deux étapes: obtenez une liste des éléments de votre matrice, puis comptez les éléments avec chaque valeur.

-- get list of elements using list comprehension
elements = [matrix i j | i <- [1..3], j <- [1..3]]

-- define counting function
count (x,y,z) (1:tail) = count (x+1,y,z) tail
count (x,y,z) (2:tail) = count (x,y+1,z) tail
count (x,y,z) (3:tail) = count (x,y,z+1) tail
count scores [] = scores

-- use counting function
(a,b,c) = count (0,0,0) elements

Il existe de meilleurs moyens d’accumuler des scores, mais cela semble au plus près de ce que votre question cherche.


Par commentaires ci-dessous, un exemple de méthode de comptage plus idiomatique, utilisant foldl et une fonction d'accumulation addscore à la place du count fonction ci-dessus:

-- define accumulation function
addscore (x,y,z) 1 = (x+1,y,z)
addscore (x,y,z) 2 = (x,y+1,z)
addscore (x,y,z) 3 = (x,y,z+1)

-- use accumulation function
(a,b,c) = foldl addscore (0,0,0) elements