Pages: [1]   Go Down
Print
Author Topic: Esercizio 1 Haskell  (Read 903 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« on: 03-09-2014, 11:27:30 »

Definire il dato astratto "Tipo", gli oggetti di questo tipo rappresentano i tipi dei sistemi a' la Church e a' la Curry.

Anche se la soluzione è presente sulla pagina degli esercizi, vorrei proporre una soluzione alternativa e chiedere se è corretta.

data Tipo = TipoCurry | TipoChurch
data TypeVar = TypeVar a

data TipoCurry = MkVar TypeVar | ArrowCurry TipoCurry  TipoCurry
data TipoChurch = MkBaseInt Int | MkBaseBool Bool | ArrowChurch TipoChurch TipoChurch

in particolare, le differenze rispetto la soluzione proposta sono
1) nel tipo "variabile tipo" l'argomento del mio costruttore è una variabile tipo invece di un Int
2) cosi come richiesto dall'esercizio, definisco un tipo di dati "Tipo" che rappresenta gli oggetti dei sistemi a' la Curry e a' la Church.

Spero di aver agito correttamente 
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #1 on: 03-09-2014, 12:06:48 »

Hai provato a lavorare un po' con oggetti di tipo Tipo?

Fammi sapere.

FB
Logged
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #2 on: 03-09-2014, 14:41:19 »

su GHCi mi da problemi con TypeVar a... sostituendolo con TypeVar Int pero' non mi da problemi.... considerando la sua domanda penso che sia ancora sbagliato, ma vorrei provare a capire.

Dunque per me il tipo "Tipo" è un TipoCurry oppure un TipoChurch e lo esprimo in questo modo
data Tipo = TipoCurry | TipoChurch

Gli elementi dell'insieme delle variabili tipo li considero come se fossero numerati (x_1, x_2, ecc...) quindi il tipo variabile lo esprimo in questo modo
data TypeVar = TypeVar Int

Un TipoCurry può essere una variabile tipo oppure un tipo freccia da un TipoCurry ad un TipoCurry
data TipoCurry = MkVar TypeVar | ArrowCurry TipoCurry  TipoCurry

L'insieme dei termini a' la Church è partizionato in sottoinsiemi, considero i sottoinsiemi per gli interi, per i booleani ed i tipi freccia
data TipoChurch = MkBaseInt Int | MkBaseBool Bool | ArrowChurch TipoChurch TipoChurch

dove sbaglio?
valutando queste definizioni posso fare valutare correttamente all'interprete espressioni come questa:

:type (ArrowChurch (MkBaseBool True) (MkBaseInt 4))

che ha valore
(ArrowChurch (MkBaseBool True) (MkBaseInt 4)) :: TipoChurch
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #3 on: 05-09-2014, 13:52:49 »

OK.

Ti ho chiesto pero' di scrivere qualche funzione che lavori sul tipo Tipo.

Fammi sapere.

FB

Logged
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #4 on: 05-09-2014, 16:55:02 »

Ok credo di aver capito... ho definito le seguenti funzioni

accoppia :: Tipo -> Tipo -> [Tipo]
accoppia x y = [x,y]

churchOrcurry :: Tipo -> String
churchOrcurry TipoCurry = "Curry"
churchOrcyrry TipoChurch = "Church"

e l'interprete non da problemi.... provando ad usare la seconda con la seguente espressione

churchOrcurry (MkBaseInt 3)

mi da un errore dicendomi che si aspetta un tipo "Tipo" mentre riceve un "TipoChurch"... infatti :type (MkBaseInt 3) è TipoChurch.

Se ho capito correttamente, l'errore sta nel fatto che TipoChurch è sia un tipo sia uno dei due costruttori del tipo "Tipo", i costruttori ed i tipi stanno in due namespaces diversi per cui posso definirli  in questo modo ma si riferiscono a due cose diverse.

è giusto?


Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.072



WWW
« Reply #5 on: 09-09-2014, 12:07:00 »

Non ho assolutamente capito che senso ha la cosa seguente
accoppia :: Tipo -> Tipo -> [Tipo]
accoppia x y = [x,y]

churchOrcurry :: Tipo -> String
churchOrcurry TipoCurry = "Curry"
churchOrcyrry TipoChurch = "Church"

Il problema di fondo e' che quando tu definisci
data TipoCurry = MkVar TypeVar | ArrowCurry TipoCurry  TipoCurry
il senso della definizione e':
"sto definendo il tipo TipoCurry, i cui elementi sono costruiti tramite il costruttore MkVar che prende
come argomento un valore di tipo TypeVar, oppure tramite il costruttore ArrowChurch, che prende
come argomenti due elementi di tipo TipoCurry".
Quando definisci
data Tipo = TipoCurry | TipoChurch
il senso della definizione NON puo' cambiare e diventare:
"un oggetto di tipo Tipo e' un oggetto di tipo TipoCurry oppure un oggetto di tipo TipoChurch"....
Il senso rimane quello che abbiamo detto prima, e cioe':
"sto definendo il tipo Tipo, i cui elementi sono costruiti tramite il costruttore TipoCurry che prende
zero argomenti (e quindi e' una costante) , oppure tramite il costruttore TipoChurch, che prende
zero argomenti (e quindi e' una costante)."
In pratica il tipo Tipo che hai definito e' un insieme di due soli elementi, che hai chiamato
TipoCurry e TipoChurch.... Il fatto che questi elementi si chiamino come i due tipi che hai definito
non implica nulla.

FB

Logged
Pages: [1]   Go Up
Print
Jump to: