/ / conteggio dei risultati da una matrice definita - haskell, matrice, incremento

contando i risultati di una matrice definita - haskell, matrice, incremento

Quindi sono molto nuovo alla programmazione e Haskell lo èla prima lingua che sto imparando, il problema che sto avendo è probabilmente molto semplice, ma semplicemente non riesco a trovare una risposta, non importa quanto cerco.

Quindi in pratica quello che ho è una matrice 3x3 e ciascunodegli elementi ha un numero da 1 a 3. Questa matrice è predefinita, ora tutto ciò che devo fare è creare una funzione che quando inserisco 1, 2 o 3 mi dice quanti elementi ci sono in questa matrice con questo valore. Ho provato diverse cose, ma nessuna sembra essere consentita, ad esempio ho definito 3 variabili per ciascuno dei possibili numeri e ho cercato di definirle

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

ecc. ecc. per ogni combinazione e campo.

<- Ignorando la sintassi sbagliata che sono veramentelottando con, il fatto che io non possa usare un "=" con "se, allora" è il mio problema più grande. C'è un modo per aggirare questo o forse un modo per usare "dati memorizzati" da funzioni precedentemente definite?

Spero di aver reso la mia domanda un po 'chiara, come ho detto, "Sono solo a programmare da 2 giorni e non riesco a trovare il modo di farlo funzionare!

risposte:

1 per risposta № 1

Per impostazione predefinita, Haskell non utilizza variabili aggiornabili, ma tipicamente crea un nuovo valore e lo passa da un'altra parte (ad esempio, restituiscilo da una funzione, aggiungilo in una lista, ecc.).

Mi avvicinerei a questo in due passaggi: ottenere un elenco degli elementi dalla matrice, quindi contare gli elementi con ciascun valore.

-- 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

Ci sono modi migliori per accumulare punteggi, ma questo sembra più vicino a ciò che la tua domanda sta cercando.


Per commenti sotto, un esempio di un metodo di conteggio più idiomatico, usando foldl e una funzione di accumulo addscore invece del count funzione sopra:

-- 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