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 № 1Per 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