Come esercizio, sto implementando in Haskell un'operazione "contro" che forma una coppia da due valori di qualsiasi tipo. Attuare il tipo di dati necessario è abbastanza facile:Un "contro" in Haskell che visualizza come la sua controparte Schema
data Nil = Nil deriving (Eq)
data Pair a b = Cons a b deriving (Eq)
car (Cons x _) = x
cdr (Cons _ y) = y
caar = car . car
cdar = cdr . car
cadr = car . cdr
cddr = cdr . cdr
*Main> cddr (Cons 55 (Cons (1,2,3,4) "hello, world!"))
"hello, world!"
*Main>
ma ispirata this thread, voglio fare le coppie risultanti stampare fuori come liste regime sarebbe - tra cui la "lista improprio" infame (1 2 3 4.). La mia implementazione (vedi sotto) sta lavorando per Char di:
*Main> Cons 'a' (Cons 'b' (Cons 'c' Nil))
('a' 'b' 'c')
*Main> Cons 'a' (Cons 'b' 'c')
('a' 'b' . 'c')
*Main> Cons (Cons 'a' 'b')(Cons 'c' (Cons 'd' Nil))
(('a' . 'b') 'c' 'd')
Non funziona così bene per Int di (o qualsiasi altro tipo di dati). Quindi la mia domanda è: come posso fare questo lavoro per altri tipi di dati? vale a dire, voglio farlo funzionare in questo modo:
*Main> Cons 5 (Cons "hello" (Cons False Nil))
(5 "hello" False)
mio attuale implementazione completa segue:
data Nil = Nil deriving (Eq)
data Pair a b = Cons a b deriving (Eq)
car (Cons x _) = x
cdr (Cons _ y) = y
caar = car . car
cdar = cdr . car
cadr = car . cdr
cddr = cdr . cdr
instance Show Nil where show _ = "()"
class ShowPair a where
showRight::a->String
instance (Show a, ShowPair a, ShowPair b)=>Show (Pair a b) where
show (Cons car cdr) = "(" ++ (show car) ++ (showRight cdr) ++ ")"
instance (Show a, ShowPair a, ShowPair b)=>ShowPair (Pair a b) where
showRight (Cons car cdr) = " " ++ (show car) ++ (showRight cdr)
instance ShowPair Char where
showRight x = " . " ++ show x
instance ShowPair Int where
showRight x = " . " ++ show x
instance ShowPair Nil where
showRight _ = ""
Haskell viene fornito con un'operazione incorporata che può formare una coppia da due valori di qualsiasi tipo: '(a, b)'. Può essere scritto '(,) a b' se si vuole essere in grado di usarlo come si farebbe con una funzione. '()' quindi prende la parte del tuo 'Nil'. 'car' viene quindi scritto' fst', e 'cdr' è' snd'. – Ben
@ Ben capito - Sapevo che era probabile che stavo facendo un po 'di reinvenzione delle ruote qui. C'è un modo per ottenere coppie prodotte con (,) per stampare come liste Scheme? – gcbenison