Como ejercicio, estoy implementando en Haskell una operación 'contra' que forma un par a partir de dos valores de cualquier tipo. Implementar el tipo de datos que se necesita es bastante fácil:A 'contras' en Haskell que se muestra como su contraparte Scheme
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>
pero inspirado por this thread, quiero hacer los pares resultantes imprimen como listas régimen podrían - incluyendo la "lista impropia" infame (1 2 3 4.). Mi aplicación (véase más adelante) está trabajando para Char:
*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')
No está funcionando tan bien para Int (o de cualquier otro tipo de datos). Entonces mi pregunta es: ¿cómo puedo hacer que esto funcione para otros tipos de datos? es decir, yo quiero que funcione de esta manera:
*Main> Cons 5 (Cons "hello" (Cons False Nil))
(5 "hello" False)
Mi aplicación plena corriente sigue:
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 con una operación integrada que puede formar un par a partir de dos valores de cualquier tipo: '(a, b)'. Se puede deletrear '(,) a b' si quieres poder usarlo como lo harías con una función. '()' luego toma la parte de su 'Nil'. 'auto' se escribe' fst', y 'cdr' es' snd'. – Ben
@Ben Entendido - Sabía que era probable que estuviera haciendo una reinvención de rueda aquí. ¿Hay alguna manera de obtener pares producidos con (,) para imprimir como listas de esquemas? – gcbenison