Pages: [1]   Go Down
Print
Author Topic: Possibile soluzione all'esercizio haskell 23  (Read 890 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
rondey
Matricola
*
Offline Offline

Posts: 74


« on: 07-04-2016, 15:53:16 »

Code:
data CoppiaTipi a b= CoppiaTipi (a) (b)
   deriving (Show)

divide [] = ([], [])
divide ((CoppiaTipi a b):xs) = (a:first, b:second)
    where (first, second) = divide(xs)

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

Posts: 2.622



WWW
« Reply #1 on: 07-04-2016, 15:57:19 »

Riguardati il testo dell'esercizio.
O non lo hai capito tu, o l'ho scritto poco chiaro io.

Salutoni
FB
Logged
rondey
Matricola
*
Offline Offline

Posts: 74


« Reply #2 on: 07-04-2016, 16:21:39 »

Sono sicuro di aver interpretato male(per questo ho scritto "Possibile").
Logged
rondey
Matricola
*
Offline Offline

Posts: 74


« Reply #3 on: 08-04-2016, 10:08:29 »

Secondo tentativo:

Code:
data CoppiaTipi a b= CoppiaTipiA a | CoppiaTipiB b
   deriving (Show)

-- Esempio: ct=[CoppiaTipiA 5, CoppiaTipiB True, CoppiaTipiA 10, CoppiaTipiB False]

divide [] = ([], [])
divide ((CoppiaTipiA a):(CoppiaTipiB b):xs) = (a:first, b:second)
    where (first, second) = divide(xs)
« Last Edit: 08-04-2016, 10:36:36 by rondey » Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.622



WWW
« Reply #4 on: 08-04-2016, 14:12:31 »

Non va bene.
Vogliamo che una lista con elementi di tipo alternato abbiamo come tipo il nuovo tipo.

Se definiamo il nuovo tipo per esempio con
ListaAlternata a b = ecc. ecc.
vogliamo che se una espressione exrp sia tale che

:type expr
> expr :: ListaAlternata Bool Sting

allora abbiamo la garanzia che expr rappresenti una lista in cui c'e' primaun booleano, poi
una stringam, poi un booleano ecc. ecc.

Logged
rondey
Matricola
*
Offline Offline

Posts: 74


« Reply #5 on: 09-04-2016, 10:29:24 »

vogliamo che se una espressione exrp sia tale che

:type expr
> expr :: ListaAlternata Bool String

Terzo tentativo:

Code:
data ListaAlternata a b = ListaAlternata a b (ListaAlternata a b) | ListaEmpty
    deriving (Show)
expr= ListaAlternata False "Bubu" (ListaAlternata True "Settete" (ListaEmpty))
-- > expr :: ListaAlternata Bool [Char]

divide ListaEmpty = ([], [])
divide (ListaAlternata a b (la)) = (a:first, b:second)
    where (first, second) = divide(la)

Se non va bene nemmeno questo, preparo il mio cavallo per darmi all'ippica
« Last Edit: 09-04-2016, 10:59:10 by rondey » Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.622



WWW
« Reply #6 on: 09-04-2016, 11:23:43 »

La tua definizione di ListaAlternata e' una delle piu' eleganti che si possano trovare.
Ovviamente ha il problema che non puoi definire liste alternate di lunghezza dispari...

Non c'e' una soluzione semplice ed elegante. Al piu' si potrebbero definire due tipi differenti
data ListAlt1 a b = Empty1 | ConsLA1 a (ListAlt2 b a)
  deriving (Show)
data ListAlt2 a b = Empty2 | ConsLA2 a (ListAlt1 b a)
  deriving (Show)
ma si rischia di ingenerare confusione.

Restringiamoci quindi al tipo delle liste alternate di lunghezza pari.

In tal caso sia la tua definizione di tipo, che la funzione divide vanno bene.

Salutoni
FB
Logged
rondey
Matricola
*
Offline Offline

Posts: 74


« Reply #7 on: 10-04-2016, 11:15:36 »

Professore, ho riformulato la sua definizione in Haskell per la creazione di liste di lunghezze dispari

Code:
data ListAlt a b = Empty | ConsLA a (ListAlt b a)
  deriving (Show)

exprLA = ConsLA True (ConsLA "Bubu" (ConsLA False (ConsLA "Settete" (Empty))))
exprLB = ConsLA True (ConsLA "Bubu" (ConsLA False (Empty)))
exprLC = ConsLA False (Empty)
exprLD = Empty
--exprLF restituisce, giustamente, errore perchè non c'è l'alternanza richiesta fra Bool e String
--exprLF = ConsLA True (ConsLA False (ConsLA "Bubu" (Empty)))

divide Empty = ([], [])
divide (ConsLA a (Empty)) = ([a], [])
divide (ConsLA a (ConsLA b(la))) = (a:first, b:second)
    where (first, second) = divide(la)

Questa definizione non va bene? A me sembra perfettamente funzionante.
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.622



WWW
« Reply #8 on: 11-04-2016, 10:33:02 »

Anche a me...   
Logged
Pages: [1]   Go Up
Print
Jump to: