Pages: [1] 2   Go Down
Print
Author Topic: Aiuto esercizio Haskell  (Read 5251 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« on: 04-04-2013, 18:41:05 »

Salve a tutti, non riesco a svolgere il seguente esercizio:

"Fornire una funzione Haskell che, preso in input un predicato p sui naturali restituisca una funzione sui naturali che vale 2 sui numeri su cui p e' vero e 3 sui numeri su cui p e' falso."

In Scheme l'ho risolto così:

Code:
(define (f P?)
  (lambda (x)
    (if (P? x)
        2
        3
        )
    )
  )

Come si traduce questo in Haskell?
Vi ringrazio per le risposte.
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #1 on: 04-04-2013, 21:24:31 »

E' ancora piu' facile:

f P = \x -> if (P x) then 2 else 3

Poiche' in Haskell le funzioni sono tutte currificate, si puo' anche scrivere

f P x = if (P x) then 2 else 3

 
Logged
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« Reply #2 on: 08-04-2013, 15:03:53 »

Salve prof., ho provato a svolgere il seguente esercizio tratto dalla pagina degli esercizi del corso:

"Definire in HASKELL il dato astratto "Tipo" (gli oggetti di questo tipo di dato astratto rapresentano i tipi dei sistemi a' la Church e a' la Curry per il lambda-calcolo)."

E' corretta la seguente soluzione o dovrei correggere qualcosa?

Code:
-- Sistema a' la Curry:  T ::= A | T -> T
-- Sistema a' la Church:  T :: INT | BOOL | T -> T


data T = A | Int | Bool | Arrow T T

Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #3 on: 08-04-2013, 15:43:57 »

Salve prof., ho provato a svolgere il seguente esercizio tratto dalla pagina degli esercizi del corso:

"Definire in HASKELL il dato astratto "Tipo" (gli oggetti di questo tipo di dato astratto rapresentano i tipi dei sistemi a' la Church e a' la Curry per il lambda-calcolo)."

E' corretta la seguente soluzione o dovrei correggere qualcosa?

Code:
-- Sistema a' la Curry:  T ::= A | T -> T
-- Sistema a' la Church:  T :: INT | BOOL | T -> T


data T = A | Int | Bool | Arrow T T


Le soluzioni dovete provare a testarle per vedere se funzionano.

Una cosa alla volta: descriviamo i tipi nel sistema a' la Curry (quello a' la Church
ancora non l'abbiamo fatto....)

Per dare la definizione giusta devi formalizzare il seguente concetto:
un tipo e' una variabile di tipo: phi, psi, chi, ....
oppure un tipo freccia un tipo

SI potrebbe fare la seguente cosa?

data T = Phi | Psi | Chi.... | Arrow T T

No, le variabili di tipo sono infinite! come le rappresentiamo?

Basta pensare che anziche' chiamarle phi, psi, chi, ....
le chiamiamo phi_1, phi_2, phi_3, ....

A questo punto la rappresentazione puo' essere.....[Scrivi una proposta e fammi sapere]


FB


« Last Edit: 08-04-2013, 15:57:33 by Franco Barbanera » Logged
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« Reply #4 on: 08-04-2013, 17:34:05 »

Ecco la mia soluzione:

Code:
data T = Var Int | Arrow T T


« Last Edit: 08-04-2013, 17:53:47 by Joe » Logged
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« Reply #5 on: 08-04-2013, 18:10:11 »

In più volevo chiederle se possiamo svolgere a lezione alcuni esercizi (sempre in Haskell) : (magari solamente alcuni tra questi se non si arriva a farli tutti)

Esercizio 12
Esercizi 10, 13, 14, 17, 18, 21, 23, 29, 30


Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #6 on: 09-04-2013, 10:59:08 »

Ecco la mia soluzione:

Code:
data T = Var Int | Arrow T T




Perfetto. Magari il costruttore di variabile di tipo lo chiamerei VarT, giusto per non confondersi.

FB
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #7 on: 09-04-2013, 11:01:41 »

In più volevo chiederle se possiamo svolgere a lezione alcuni esercizi (sempre in Haskell) : (magari solamente alcuni tra questi se non si arriva a farli tutti)

Esercizio 12
Esercizi 10, 13, 14, 17, 18, 21, 23, 29, 30

Certo. Ricordamelo se dovessi scordarmelo.

FB
Logged
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« Reply #8 on: 09-04-2013, 12:57:32 »

Ecco la mia soluzione:

Code:
data T = Var Int | Arrow T T




Perfetto. Magari il costruttore di variabile di tipo lo chiamerei VarT, giusto per non confondersi.

FB

OK, grazie mille.
Logged
Joe
Apprendista Forumista
**
Offline Offline

Posts: 492


« Reply #9 on: 09-04-2013, 12:57:59 »

In più volevo chiederle se possiamo svolgere a lezione alcuni esercizi (sempre in Haskell) : (magari solamente alcuni tra questi se non si arriva a farli tutti)

Esercizio 12
Esercizi 10, 13, 14, 17, 18, 21, 23, 29, 30

Certo. Ricordamelo se dovessi scordarmelo.

FB

D'accordo.
Logged
Acicatena86
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 404


See full me now who neon


« Reply #10 on: 09-04-2013, 16:35:43 »

Buonasera professore, ho provato ad implementare in Haskell l'esercizio in scheme della lista di due liste...

Quote
Una funzione (Scheme per ora) che prende una lista e un predicato
e restituisce una lista di due liste, in cui la prima sono gli elementi
che soddisfano il predicato e la seconda gli altri.


Ecco la mia soluzione

Code:
funSplit [] p=([],[])

funSplit (xs) p=([y| y<-xs, (p y)],[x | x<-xs, not(p x)])
Logged
Acicatena86
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 404


See full me now who neon


« Reply #11 on: 09-04-2013, 17:03:38 »

Provo a rispondere ad un esercizio proposto da Joe
Code:
Esercizio 10 (Programmazione Haskell)

Definire alcuni tipi di dati albero (possibilmente parametrici). Per esempio, alberi binari etichettati, alberi ternari, alberi con numeri arbitrari di figli ecc.
Identificare poi alcune operazioni che possano essere utilizzate su ognuno di tali tipi, per esempio l'altezza.
Definire quindi una classe Tree con tali operazioni, definendo i tipi precedentemente forniti come istanze di tale classe.

In particolare ho definito un albero binario con etichette numeriche ed ho implementato la funzione altezza


ecco la mia soluzione

Code:
data BinaryTree =EBT | MkBT Int BinaryTree BinaryTree

getRadiceAlbero (MkBT n t1 t2)=n
getRadiceAlbero EBT=0

altezzaBT EBT=0
altezzaBT (MkBT n EBT EBT)=0
altezzaBT (MkBT n t1 t2)
                        |(getRadiceAlbero(t1)<getRadiceAlbero(t2))=1+altezzaBT(t1)
                        |otherwise= 1+altezzaBT(t2)
   
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #12 on: 09-04-2013, 17:17:19 »

Buonasera professore, ho provato ad implementare in Haskell l'esercizio in scheme della lista di due liste...

Quote
Una funzione (Scheme per ora) che prende una lista e un predicato
e restituisce una lista di due liste, in cui la prima sono gli elementi
che soddisfano il predicato e la seconda gli altri.


Ecco la mia soluzione

Code:
funSplit [] p=([],[])

funSplit (xs) p=([y| y<-xs, (p y)],[x | x<-xs, not(p x)])


Va bene, ma per farlo usando lo stesso algoritmo che abbiamo utilizzato per implementare questa
funzione in Scheme, occorre non usare funzioni ausiliare (la list comprehension e' come una funzione
ausiliaria).

FB
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #13 on: 09-04-2013, 17:19:20 »

Provo a rispondere ad un esercizio proposto da Joe
Code:
Esercizio 10 (Programmazione Haskell)

Definire alcuni tipi di dati albero (possibilmente parametrici). Per esempio, alberi binari etichettati, alberi ternari, alberi con numeri arbitrari di figli ecc.
Identificare poi alcune operazioni che possano essere utilizzate su ognuno di tali tipi, per esempio l'altezza.
Definire quindi una classe Tree con tali operazioni, definendo i tipi precedentemente forniti come istanze di tale classe.

In particolare ho definito un albero binario con etichette numeriche ed ho implementato la funzione altezza


ecco la mia soluzione

Code:
data BinaryTree =EBT | MkBT Int BinaryTree BinaryTree

getRadiceAlbero (MkBT n t1 t2)=n
getRadiceAlbero EBT=0

altezzaBT EBT=0
altezzaBT (MkBT n EBT EBT)=0
altezzaBT (MkBT n t1 t2)
                        |(getRadiceAlbero(t1)<getRadiceAlbero(t2))=1+altezzaBT(t1)
                        |otherwise= 1+altezzaBT(t2)
   

Non hai capito l'esercizio.....
Tu sei studiato le type classes?

FB
Logged
Acicatena86
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 404


See full me now who neon


« Reply #14 on: 09-04-2013, 19:59:12 »

Provo a rispondere ad un esercizio proposto da Joe
Code:
Esercizio 10 (Programmazione Haskell)

Definire alcuni tipi di dati albero (possibilmente parametrici). Per esempio, alberi binari etichettati, alberi ternari, alberi con numeri arbitrari di figli ecc.
Identificare poi alcune operazioni che possano essere utilizzate su ognuno di tali tipi, per esempio l'altezza.
Definire quindi una classe Tree con tali operazioni, definendo i tipi precedentemente forniti come istanze di tale classe.



In particolare ho definito un albero binario con etichette numeriche ed ho implementato la funzione altezza


ecco la mia soluzione

Code:
data BinaryTree =EBT | MkBT Int BinaryTree BinaryTree

getRadiceAlbero (MkBT n t1 t2)=n
getRadiceAlbero EBT=0

altezzaBT EBT=0
altezzaBT (MkBT n EBT EBT)=0
altezzaBT (MkBT n t1 t2)
                        |(getRadiceAlbero(t1)<getRadiceAlbero(t2))=1+altezzaBT(t1)
                        |otherwise= 1+altezzaBT(t2)
  

Non hai capito l'esercizio.....
Tu sei studiato le type classes?

FB

Prof praticamente ho capito male il testo dell'esercizio, proprio mi è sfuggito questa parte

"Identificare poi alcune operazioni che possano essere utilizzate su ognuno di tali tipi, per esempio l'altezza.
Definire quindi una classe Tree con tali operazioni, definendo i tipi precedentemente forniti come istanze di tale classe. "


Praticamente avevo capito di definire il tipo di dato "Albero binario con etichette numeriche" e scrivere la funzione che trova l'altezza dell'albero !



« Last Edit: 09-04-2013, 20:02:33 by Acicatena86 » Logged
Pages: [1] 2   Go Up
Print
Jump to: