Pages: [1]   Go Down
Print
Author Topic: definizione di nuovi tipi di dati in haskell  (Read 1978 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
rox
Forumista
***
Offline Offline

Posts: 633


« on: 03-07-2014, 12:36:22 »

Salve a tutti,
come da oggetto qualcuno potrebbe mostrarmi come si crea un nuovo tipo di dato? (sia ricorsivo che non)

ho visto dagli appunti del prof come si definisce un tipo, e l'interprete non mi segnala errori, ma poi non ho capito come fare da terminale a richiamare questo tipo di dato... mi spiego meglio. Io ho fatto questo nuovo tipo di dato:

Code:
data NumBinTree = EmptyNBTree|MkNBTree Integer NumBinTree NumBinTree deriving(Show)

inorder EmptyNBTree = []
inorder (MkNBTree n t1 t2) = (inorder t1)++[n]++(inorder t2)

in questo modo dovrei definire un albero e poi definisco la visita inorder... credo che quanto scritto sia corretto...
ma poi da terminale come faccio a creare un albero di questo tipo e a utilizzare la funzione inorder? non mi sono molto chiare queste cose ...
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: 03-07-2014, 17:57:56 »

Se vuoi definire un albero di nome pippo che corrisponda a quello che
graficamente indichiamo con

    3
  /    \
1      2

basta che dopo nel file inserisci la seguente definizione

pippo =  MkNBTree 3 (MkNBTree 1  EmptyNBTree EmptyNBTree) ( MkNBTree 2 EmptyNBTree EmptyNBTree)


Se dopo il prompt dell'interprete scrivi
> inorder pippo
otterrai
[1,3,2]

Se scrivi
> pippo

otterrai
MkNBTree 3 (MkNBTree 1  EmptyNBTree EmptyNBTree) ( MkNBTree 2 EmptyNBTree EmptyNBTree)

Infatti con il deriving(Show) hai inserito il tuo tipo di dato nella classe Show dei tipi
visibili da terminale definendo la funzione show per default.
Se vuoi vedere un albero a terminale in modo diverso, devi inserire il tipo di dato
esplicitamente nella classe Show definendo la funzione show in modo che un
albero sia mostrato come preferisci.

Pace e Bene
FB

Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #2 on: 04-07-2014, 10:23:05 »

ok, la ringrazio prof!  ho anche scoperto che da terminale possiamo scrivere semplicemente let x= creazione dell'albero in questo caso ! ovvero da terminale ho scritto questo :
Code:
let pippo=MkNBTree 3 (MkNBTree 1  EmptyNBTree EmptyNBTree) ( MkNBTree 2 EmptyNBTree EmptyNBTree)

e poi ho richiamato l'inorder come definita anzitempo e ha dato lo stesso risultato che ha enunciato lei  lo scrivo giusto per aiutare qualche collega che magari ha avuto il mio stesso problema  [Emoticon] Asd
Logged

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

Posts: 633


« Reply #3 on: 04-07-2014, 11:00:56 »

mmm altro problema ... ho creato questa funzione per l'inserimento all'interno di un albero :
Code:
insertorder x EmptyNBTree= MkNBTree x EmptyNBTree EmptyNBTree
insertord x (MkNBTree y t1 t2)|x<y=MkNBTree y(insertord x t1) t2 |otherwise=MkNBTree y t1 (insertord x t2)

poi non ho capito come richiamare questa funzione correttamente... è un'esempio fatto a lezione(con qualche modifica mia), e non ho ben chiaro cosa facciamo dentro il metodo... qualcuno me lo potrebbe spiegare? io da terminale scrivo questo:

Code:
insertord 5 pippo

e mi esce questa riga ... di cui non ho capito il significato...

Code:
MkNBTree 3 (MkNBTree 1 EmptyNBTree EmptyNBTree) (MkNBTree 2 EmptyNBTree *** Exception: oggetti.hs:20:1-106: Non-exhaustive patterns in function insertord
 testate testate
« Last Edit: 04-07-2014, 11:08:39 by rox » 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 #4 on: 04-07-2014, 12:11:05 »

Forse perche' la funzione la chiami "insertorder" nella prima equazione e "insertord" nella seconda?!?!?

Ovvio che quando l'interprete arriva a valutare insertord sull'albero vuoto non sappia come calcolarlo...

Una curiosita': la definizione
insertord x (MkNBTree y t1 t2)|x<y=MkNBTree y(insertord x t1) t2 |otherwise=MkNBTree y t1 (insertord x t2)
l'hai scritta sulla stessa riga giusto per complicare la vita a chi legge i tuoi programmi?
o c'e' qualche recondito motivo che sfugge alla mia comprensione?

FB

Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #5 on: 04-07-2014, 13:34:53 »

Forse perche' la funzione la chiami "insertorder" nella prima equazione e "insertord" nella seconda?!?!?

Ovvio che quando l'interprete arriva a valutare insertord sull'albero vuoto non sappia come calcolarlo...

Una curiosita': la definizione
insertord x (MkNBTree y t1 t2)|x<y=MkNBTree y(insertord x t1) t2 |otherwise=MkNBTree y t1 (insertord x t2)
l'hai scritta sulla stessa riga giusto per complicare la vita a chi legge i tuoi programmi?
o c'e' qualche recondito motivo che sfugge alla mia comprensione?

FB



bhe sinceramente l'ho scritta così perchè pensavo che poi l'interprete facesse problemi... tra le varie prove che ho fatto avevo notato questo... magari è stata una mia svista, come quella appena fatta del resto  testate

mmm ho modificato il codice e non mi dà più errori, ma non capisco una cosa... quando richiamo l'inorder sull'albero pippo, dopo l'inserimento, questo non è cambiato ... ciò che accade è coerente con la programmazione funzionale, ma vorrei capire allora in che modo si può simulare la creazione di un albero?  testate testate nel senso se devo creare un albero dal nulla usando la funzione di inserimento, in questo modo non posso farlo ... in java noi creavamo invece gli alberi dal nulla partendo da un albero vuoto e l'albero veniva modificato... ma qui invece?  testate

ho pensato di fare così:
Code:
let mia=insertorder 5 pippo
e poi ovviamente vedere i cambiamenti sul nuovo dato denominato mia... la soluzione è corretta per simulare l'espansione di una struttura dati in generale? Smiley
« Last Edit: 04-07-2014, 16:40:37 by rox » 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 #6 on: 05-07-2014, 10:36:30 »

insertorder 5 pippo

e' un albero che non c'entra nulla con pippo

nello stesso modo in cui 5 , ottenuto valutando 2+3, non c'entra nulla
con 2 e 3.
Non e' che 5 si ottiene "modificando" 2 e 3....

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #7 on: 05-07-2014, 13:43:24 »

ok, quindi la mia ultima deduzione era corretta evil 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: