Pages: [1]   Go Down
Print
Author Topic: utilizzo della clausola case in haskell  (Read 1303 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
rox
Forumista
***
Offline Offline

Posts: 633


« on: 20-08-2014, 15:00:56 »

salve a tutti, stavo cercando di capire come si usasse la classica clausola switch case in haskell, ma ho avuto dei problemi ...
in pratica ho scritto prima questa funzione per capire appunto come funzionasse questa clausola:
Code:
usoCase x    |  x==0     = 1
             |  x==1     = 10
             |  x==2     = 100
             | otherwise  = 2000000


e questa funzione va a buon fine dando i risultati sperati. A questo punto ho provato a fare una funzione che prende in input una lista e che mi dia il penultimo elemento della lista. Ovviamente i casi da considerare per questa funzione sono 3:
1)lista di lunghezza 1,
2)lista di lunghezza 2,
3) lista di qualsiasi altra lunghezza!
 questa la funzione da me scritta:

Code:
myPenultimo (x) |  length x==1  =x
                |  length x==2  =head x
                |  otherwise    = myPenultimo(tail x)


l'errore segnalatomi dal compilatore è il seguente:

Code:
Occurs check: cannot construct the infinite type: a0 = [a0]
    Expected type: [[a0]]
      Actual type: [a0]
    In the first argument of `head', namely `x'
    In the expression: head x
    In an equation for `myPenultimo':
        myPenultimo (x)
          | length x == 1 = x
          | length x == 2 = head x
          | otherwise = myPenultimo (tail x)
Failed, modules loaded: none.

qualcuno sa spiegarmi il perchè di questo errore e come lo potrei correggere?  testate testate
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #1 on: 28-08-2014, 22:16:48 »

C'e' un errore nella definizione.

myPenultimo (x) |  length x==1  =x
                |  length x==2  =head x
                |  otherwise    = myPenultimo(tail x)

In un caso la funzione restituisce x, in un altro head x.
Quindi il codominio della funzione e' il tipo di x e di head x.
Quindi x ed head x debbono avere lo stesso tipo.
Poiche' ad x applichi head, il tipo di x deve essere una lista. Quindi un tipo della forma [T].
Se x ha tipo [T], allora head x ha tipo T.
Poiche' , per quanto detto all'inizio, x e head x hanno lo stesso tipo,
deve essere che T coincide con [T]. Impossibile! (a meno che T sia un tipo infinito).
Ed in sintesi questo e' quanto ti dice anche l'interprete.

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #2 on: 29-08-2014, 09:04:13 »

la ringrazio per la spiegazione prof!  ho modificato così :
Code:
myPenultimo (x) |  length x==1  =head x
                |  length x==2  =head x
                |  otherwise    = myPenultimo(tail x)

e in questo modo funziona! 
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #3 on: 29-08-2014, 18:12:05 »

e in questo modo funziona! 

Non credo...
Cosa restituisce myPenultimo []  ?

Piuttosto, le parentesi per l'argomento non servono!!!

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #4 on: 30-08-2014, 11:36:27 »

bhe mi restituisce esattamente quello che io voglio ... direttamente dal mio terminale:
Code:
*Main> myPenultimo [1]
1
*Main> myPenultimo [1,2]
1
*Main> myPenultimo [1,2,5,6,7]
6
*Main>
la funzione non dovrebbe restituire esattamente questo? credo che la definizione del penultimo elemento di una lista sia questa... o sbaglio?  testate
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #5 on: 30-08-2014, 19:09:28 »

Intendevo dire che mentre il tipo della funzione dice che il dominio sono liste,
in realta' il dominio sono liste non vuote.
Infatti sulla lista vuota la funzione produce un errore.

Non e' una cosa di cui occuparsi ora, ma all'interno di un programma vero e proprio
bisogna tener presente questo problema (che si puo' gestire in vari modi a seconda delle necessita').

FB
 
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #6 on: 31-08-2014, 12:27:44 »

capito 
in questo caso la correzione è abbastanza banale e ce ne sono molte. Io ho pensato di farla così :

Code:
myPenultimo (x) |  length x==0  =[]
                |  length x==1  =head x
                |  length x==2  =head x
                |  otherwise    = myPenultimo(tail x)

in questo modo ho passato in rassegna tutti i casi  così va bene prof? 
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #7 on: 31-08-2014, 13:16:38 »

E' un modo di risolverlo, certo.
Se invece il programma in cui utilizzassi myPenultimo imponesse di vedere il penultimo di una lista vuota
(o di una lista con un elemento) come un errore, allora bisognerebbe fare in qualche altro modo.
Per i nostri scopi, va benissimo la tua soluzione.

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #8 on: 31-08-2014, 20:09:37 »

ok la ringrazio prof! 
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Pages: [1]   Go Up
Print
Jump to: