#LyX 2.3 created this file. For more info see http://www.lyx.org/ \lyxformat 544 \begin_document \begin_header \save_transient_properties true \origin unavailable \textclass book \begin_preamble \input{../defs} \end_preamble \use_default_options true \maintain_unincluded_children false \language spanish \language_package default \inputencoding auto \fontencoding global \font_roman "default" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \use_microtype false \use_dash_ligatures true \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \use_minted 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \is_math_indent 0 \math_numbering_side default \quotes_style french \dynamic_quotes 0 \papercolumns 1 \papersides 1 \paperpagestyle default \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard Haskell tiene un preludio estándar con tipos y funciones predefinidos. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout infixr 9 ., !! \end_layout \begin_layout Plain Layout infixr 8 ^ \end_layout \begin_layout Plain Layout infixl 7 *, /, `quot`, `rem`, `div`, `mod` \end_layout \begin_layout Plain Layout infixl 6 +, - \end_layout \begin_layout Plain Layout infixl 5 ++ \end_layout \begin_layout Plain Layout infix 4 ==, /=, <, <=, >=, >, `elem` \end_layout \begin_layout Plain Layout infixr 3 && \end_layout \begin_layout Plain Layout infixr 2 || \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset Note Comment status open \begin_layout Plain Layout ^^, .., =<<, $, $!, `seq`, `notElem` \end_layout \end_inset \end_layout \begin_layout Standard Cuando se indica \family typewriter ... \family default en código significa que no se puede definir en Haskell, y cuando se indica con \family typewriter ,,, \family default significa que sería demasiado engorroso. Si se define que un tipo es de una clase, también lo es de sus superclases, y si no se da la definición de la instancia de superclase es porque no se puede definir en Haskell. \end_layout \begin_layout Section Clases derivables \end_layout \begin_layout Standard Estas clases se pueden derivar en una instancia \family typewriter data \family default con al menos un constructor o una \family typewriter newtype \family default si todos los tipos en los parámetros de todos los constructores son instancias de la clase en algún contexto y no hay una declaración de instancia que haga conflicto. \end_layout \begin_layout Standard \family typewriter () \family default , \family typewriter (a,b) \family default , \family typewriter (a,b,c) \family default y \family typewriter [a] \family default implementan \family typewriter Eq \family default y \family typewriter Ord \family default como se indica, las tres primeras implementan también \family typewriter Bounded \family default y \family typewriter () \family default implementa también \family typewriter Enum \family default . \end_layout \begin_layout Subsection \family typewriter Eq \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout class Eq a where {-# MINIMAL (==) | (/=) #-} \end_layout \begin_layout Plain Layout (==), (/=) :: a -> a -> Bool \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout x /= y = not (x == y) \end_layout \begin_layout Plain Layout x == y = not (x /= y) \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter \emph on a \emph default == \emph on b \family default \emph default si \family typewriter \emph on a \family default \emph default y \family typewriter \emph on b \family default \emph default tienen el mismo constructor y todos sus campos son iguales ( \family typewriter == \family default ), salvo que si un campo de \family typewriter \emph on a \family default \emph default o \family typewriter \emph on b \family default \emph default es \begin_inset Formula $\bot$ \end_inset , \family typewriter \emph on a \emph default == \emph on b \family default \emph default devuelve \begin_inset Formula $\bot$ \end_inset si todos los campos anteriores al primer \begin_inset Formula $\bot$ \end_inset son iguales, y si \family typewriter \emph on a \family default \emph default o \family typewriter \emph on b \family default \emph default es \begin_inset Formula $\bot$ \end_inset el resultado es \begin_inset Formula $\bot$ \end_inset . \end_layout \begin_layout Subsection \family typewriter Ord \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout data Ordering = LT | EQ | GT \end_layout \begin_layout Plain Layout deriving (Eq, Ord, Enum, Read, Show, Bounded) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class (Eq a) => Ord a where {-# MINIMAL compare | (<=) #-} \end_layout \begin_layout Plain Layout compare :: a -> a -> Ordering \end_layout \begin_layout Plain Layout (<), (<=), (>=), (>) :: a -> a -> Bool \end_layout \begin_layout Plain Layout max, min :: a -> a -> a \end_layout \begin_layout Plain Layout compare x y \end_layout \begin_layout Plain Layout | x == y = EQ \end_layout \begin_layout Plain Layout | x <= y = LT \end_layout \begin_layout Plain Layout | True = GT \end_layout \begin_layout Plain Layout x <= y = compare x y /= GT \end_layout \begin_layout Plain Layout x < y = compare x y == LT \end_layout \begin_layout Plain Layout x >= y = compare x y /= LT \end_layout \begin_layout Plain Layout x > y = compare x y == GT \end_layout \begin_layout Plain Layout max x y = if x <= y then y else x \end_layout \begin_layout Plain Layout min x y = if x <= y then x else y \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter \emph on a \emph default <= \emph on b \family default \emph default si \family typewriter \emph on a \emph default == \emph on b \family default \emph default según la definición por defecto, \family typewriter \emph on a \family default \emph default tiene un constructor definido más a la izquierda que el de \family typewriter \emph on b \family default \emph default o ambos tienen el mismo y existe un campo cuyo valor en \family typewriter \emph on a \family default \emph default es menor ( \family typewriter < \family default ) que en \family typewriter \emph on b \family default \emph default y todos los anteriores son iguales, salvo que \family typewriter (<=) \family default devuelve \begin_inset Formula $\bot$ \end_inset en los mismos casos que \family typewriter (==) \family default . \end_layout \begin_layout Subsection \family typewriter Bounded \end_layout \begin_layout Standard Sólo si ningún constructor tiene campos o solo hay un constructor. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout class Bounded a where \end_layout \begin_layout Plain Layout minBound, maxBound :: a \end_layout \end_inset \end_layout \begin_layout Standard En un enumerado, \family typewriter minBound \family default es el elemento del primer constructor y \family typewriter maxBound \family default el del último, y en otro caso \family typewriter minBound \family default y \family typewriter maxBound \family default son los elementos del único constructor con el \family typewriter minBound \family default o el \family typewriter maxBound \family default de cada campo. \end_layout \begin_layout Subsection \family typewriter Enum \end_layout \begin_layout Standard Sólo si ningún constructor tiene campos. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout class Enum a where {-# MINIMAL toEnum, fromEnum #-} \end_layout \begin_layout Plain Layout toEnum :: Int -> a \end_layout \begin_layout Plain Layout fromEnum :: a -> Int \end_layout \begin_layout Plain Layout succ, pred :: a -> a \end_layout \begin_layout Plain Layout enumFrom :: a -> [a] \end_layout \begin_layout Plain Layout enumFromThen, enumFromTo :: a -> a -> [a] \end_layout \begin_layout Plain Layout enumFromThenTo :: a -> a -> a -> [a] \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout succ x = toEnum (fromEnum x + 1) \end_layout \begin_layout Plain Layout pred x = toEnum (fromEnum x - 1) \end_layout \begin_layout Plain Layout enumFrom x = map toEnum [fromEnum x ..] \end_layout \begin_layout Plain Layout enumFromTo x y = map toEnum [fromEnum x .. fromEnum y] \end_layout \begin_layout Plain Layout enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..] \end_layout \begin_layout Plain Layout enumFromThenTo x y z = \end_layout \begin_layout Plain Layout map toEnum [fromEnum x, fromEnum y .. fromEnum z] \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter toEnum 0 \family default devuelve el primer elemento del enumerado (el del primer constructor), \family typewriter toEnum 1 \family default el segundo, etc., y para cualquier otro \family typewriter \emph on x \family default \emph default , \family typewriter toEnum \emph on x \family default \emph default devuelve \begin_inset Formula $\bot$ \end_inset . \family typewriter fromEnum \family default es la inversa de \family typewriter toEnum \family default . Si \family typewriter firstCon \family default es el primer constructor y \family typewriter lastCon \family default el último, se define \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout enumFrom x = enumFromTo x lastCon \end_layout \begin_layout Plain Layout enumFromThen x y = enumFromThenTo x y bound \end_layout \begin_layout Plain Layout where bound | fromEnum x <= fromEnum y = lastCon \end_layout \begin_layout Plain Layout | otherwise = firstCon \end_layout \end_inset \end_layout \begin_layout Subsection \family typewriter Show \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout type ShowS = String -> String \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class Show a where {-# MINIMAL showsPrec | show #-} \end_layout \begin_layout Plain Layout showsPrec :: Int -> a -> ShowS \end_layout \begin_layout Plain Layout show :: a -> String \end_layout \begin_layout Plain Layout showsPrec _ x s = show x ++ s \end_layout \begin_layout Plain Layout show x = showsPrec 0 x \begin_inset Quotes cld \end_inset \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter showsPrec \emph on d x r \family default \emph default devuelve una representación de \family typewriter \emph on x \family default \emph default como expresión Haskell, entre paréntesis si el constructor de \family typewriter \emph on x \family default \emph default tiene precedencia menor que \family typewriter \emph on d \family default \emph default considerando que la precedencia de una aplicación funcional es 10, seguida de \family typewriter \emph on r \family default \emph default . \end_layout \begin_layout Standard La representación está formada por el nombre del constructor y las representacio nes de los parámetros según su \family typewriter showsPrec \family default , posiblemente separados por espacios, y añadiendo paréntesis si hacen falta por precedencia aunque no hagan falta por asociatividad. El constructor se muestra en forma infija si y sólo si es un \family typewriter qconop \family default , y si usa sintaxis con llaves, la representación también, con los campos en el mismo orden. Puede haber más espaciado o paréntesis de lo necesario. \end_layout \begin_layout Subsection \family typewriter Read \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout type ReadS a = String -> [(a, String)] \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class Read a where \end_layout \begin_layout Plain Layout readsPrec :: Int -> ReadS a \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter readsPrec \emph on d s \family default \emph default intenta leer del principio de \family typewriter \emph on s \family default \emph default un elemento de tipo \family typewriter \emph on a \family default \emph default devuelto por \family typewriter showsPrec \family default y devuelve una lista de pares con el valor leído y el resto de la cadena, que será vacía si la entrada no es correcta. \family typewriter ( \emph on x \emph default , \begin_inset Quotes qrd \end_inset \begin_inset Quotes qrd \end_inset ) \family default debe ser un elemento de \family typewriter readsPrec \emph on d \emph default (showsPrec \emph on d x \emph default \begin_inset Quotes qld \end_inset \begin_inset Quotes qrd \end_inset ) \family default . \end_layout \begin_layout Section Booleanos \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout data Bool = False | True deriving (Eq, Ord, Enum, Read, Show, Bounded) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout (&&), (||) :: Bool -> Bool -> Bool \end_layout \begin_layout Plain Layout True && x = x \end_layout \begin_layout Plain Layout False && _ = False \end_layout \begin_layout Plain Layout True || _ = True \end_layout \begin_layout Plain Layout False || x = x \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout not :: Bool -> Bool \end_layout \begin_layout Plain Layout not True = False \end_layout \begin_layout Plain Layout not False = True \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout otherwise :: Bool \end_layout \begin_layout Plain Layout otherwise = True \end_layout \end_inset \end_layout \begin_layout Section Funciones \end_layout \begin_layout Standard \begin_inset Note Comment status open \begin_layout Plain Layout seq, ($), ($!) \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset listings lstparams "language=Haskell" inline false status open \begin_layout Plain Layout id :: a -> a \end_layout \begin_layout Plain Layout id x = x \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout const :: a -> b -> a \end_layout \begin_layout Plain Layout const x _ = x \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout (.) :: (b -> c) -> (a -> b) -> a -> c \end_layout \begin_layout Plain Layout f . g = \backslash x -> f (g x) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout flip :: (a -> b -> c) -> b -> a -> c \end_layout \begin_layout Plain Layout flip f x y = f y x \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter until \emph on f p \family default \emph default evalúa \family typewriter \emph on f \family default \emph default sobre un argumento hasta que cumple \family typewriter \emph on p \family default \emph default . \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout until :: (a -> Bool) -> (a -> a) -> a -> a \end_layout \begin_layout Plain Layout until p f x | p x = x \end_layout \begin_layout Plain Layout | otherwise = until p f (f x) \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter error \emph on s \family default \emph default devuelve \begin_inset Formula $\bot$ \end_inset y, cuando se evalúa, imprime el error \family typewriter \emph on s \family default \emph default . \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout error :: String -> a \end_layout \begin_layout Plain Layout error s = ... \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout undefined :: a \end_layout \begin_layout Plain Layout undefined = error \begin_inset Quotes cld \end_inset Prelude.undefined \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Section Tuplas \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout fst :: (a, b) -> a \end_layout \begin_layout Plain Layout fst (x, y) = x \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout snd :: (a, b) -> b \end_layout \begin_layout Plain Layout snd (x, y) = y \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout curry :: ((a, b) -> c) -> a -> b -> c \end_layout \begin_layout Plain Layout curry f x y = f (x, y) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout uncurry :: (a -> b -> c) -> (a, b) -> c \end_layout \begin_layout Plain Layout uncurry f (x, y) = f x y \end_layout \end_inset \end_layout \begin_layout Section Clases numéricas \end_layout \begin_layout Standard \begin_inset Note Comment status open \begin_layout Plain Layout recip, (**), logBase, round, ceiling, floor, RealFloat \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout class (Eq a, Show a) => Num a where \end_layout \begin_layout Plain Layout {-# MINIMAL (+), (*), abs, signum, fromInteger, # \end_layout \begin_layout Plain Layout # (negate | (-)) #-} \end_layout \begin_layout Plain Layout (+), (-), (*) :: a -> a -> a \end_layout \begin_layout Plain Layout negate :: a -> a \end_layout \begin_layout Plain Layout abs, signum :: a -> a \end_layout \begin_layout Plain Layout fromInteger :: Integer -> a \end_layout \begin_layout Plain Layout x - y = x + negate y \end_layout \begin_layout Plain Layout negate x = 0 - x \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class (Num a, Ord a) => Real a where \end_layout \begin_layout Plain Layout toRational :: a -> Rational \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class (Real a, Enum a) => Integral a where \end_layout \begin_layout Plain Layout {-# MINIMAL quotRem, toInteger #-} \end_layout \begin_layout Plain Layout quot, rem, div, mod :: a -> a -> a \end_layout \begin_layout Plain Layout quotRem, divMod :: a -> a -> (a,a) \end_layout \begin_layout Plain Layout toInteger :: a -> Integer \end_layout \begin_layout Plain Layout divMod n d = let (q, r) = quotRem n d in \end_layout \begin_layout Plain Layout if signum r == - signum d then (q-1, r+d) \end_layout \begin_layout Plain Layout else (q, r) \end_layout \begin_layout Plain Layout n `quot` d = q where (q, r) = quotRem n d \end_layout \begin_layout Plain Layout n `rem` d = r where (q, r) = quotRem n d \end_layout \begin_layout Plain Layout n `div` d = q where (q, r) = divMod n d \end_layout \begin_layout Plain Layout n `mod` d = r where (q, r) = divMod n d \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class (Num a) => Fractional a where \end_layout \begin_layout Plain Layout (/) :: a -> a -> a \end_layout \begin_layout Plain Layout fromRational :: Rational -> a \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class (Fractional a) => Floating a where \end_layout \begin_layout Plain Layout {-# MINIMAL pi, exp, log, sin, cos, asin, acos, atan, # \end_layout \begin_layout Plain Layout # sinh, cosh, asinh, acosh, atanh #-} \end_layout \begin_layout Plain Layout pi :: a \end_layout \begin_layout Plain Layout exp, log, sqrt :: a -> a \end_layout \begin_layout Plain Layout sin, cos, tan, asin, acos, atan :: a -> a \end_layout \begin_layout Plain Layout sinh, cosh, tanh, asinh, acosh, atanh :: a -> a \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout sqrt x = x ** 0.5 \end_layout \begin_layout Plain Layout tan x = sin x / cos x \end_layout \begin_layout Plain Layout tanh x = sinh x / cosh x \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout class RealFrac a where {-# MINIMAL properFraction #-} \end_layout \begin_layout Plain Layout properFraction :: (Integral b) => a -> (b, a) \end_layout \begin_layout Plain Layout truncate :: (Integral b) => a -> b \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout truncate = fst . properFraction \end_layout \end_inset \end_layout \begin_layout Section Funciones numéricas \end_layout \begin_layout Standard \begin_inset Note Comment status open \begin_layout Plain Layout subtract, (^^), realToFrac \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout even, odd :: (Integral a) => a -> Bool \end_layout \begin_layout Plain Layout even n = n `rem` 2 == 0 \end_layout \begin_layout Plain Layout odd = not . even \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout gcd, lcm :: (Integral a) => a -> a -> a \end_layout \begin_layout Plain Layout gcd x y = gcd' (abs x) (abs y) \end_layout \begin_layout Plain Layout where gcd' x 0 = x \end_layout \begin_layout Plain Layout gcd' x y = gcd' y (x `rem` y) \end_layout \begin_layout Plain Layout lcm _ 0 = 0 \end_layout \begin_layout Plain Layout lcm 0 _ = 0 \end_layout \begin_layout Plain Layout lcm x y = abs ((x `quot` (gcd x y)) * y) \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout (^) :: (Num a, Integral b) => a -> b -> a \end_layout \begin_layout Plain Layout x ^ 0 = 1 \end_layout \begin_layout Plain Layout x ^ (n+1) = x * x^n \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout fromIntegral :: (Integral a, Num b) => a -> b \end_layout \begin_layout Plain Layout fromIntegral = fromInteger . toInteger \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout instance Bounded Int where ... \end_layout \begin_layout Plain Layout instance Integral Int where ... \end_layout \begin_layout Plain Layout instance Integral Integer where ... \end_layout \begin_layout Plain Layout instance RealFrac Float where ... \end_layout \begin_layout Plain Layout instance Floating Float where ... \end_layout \begin_layout Plain Layout instance RealFrac Double where ... \end_layout \begin_layout Plain Layout instance Floating Double where ... \end_layout \end_inset \end_layout \begin_layout Section Caracteres \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout instance Enum Char where ... \end_layout \begin_layout Plain Layout instance Bounded Char where \end_layout \begin_layout Plain Layout minBound = ' \backslash 0' \end_layout \begin_layout Plain Layout maxBound = ... \end_layout \begin_layout Plain Layout instance Eq Char where \end_layout \begin_layout Plain Layout c == c' = fromEnum c == fromEnum c' \end_layout \begin_layout Plain Layout instance Ord Char where \end_layout \begin_layout Plain Layout c <= c' = fromEnum c <= fromEnum c' \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout type String = [Char] \end_layout \end_inset \end_layout \begin_layout Section Lectura y escritura \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout instance Show Int where ,,, \end_layout \begin_layout Plain Layout instance Read Int where ,,, \end_layout \begin_layout Plain Layout instance Show Integer where ,,, \end_layout \begin_layout Plain Layout instance Read Integer where ,,, \end_layout \begin_layout Plain Layout instance Show Float where ,,, \end_layout \begin_layout Plain Layout instance Read Float where ,,, \end_layout \begin_layout Plain Layout instance Show Double where ,,, \end_layout \begin_layout Plain Layout instance Read Double where ,,, \end_layout \begin_layout Plain Layout instance Show () where show _ = \begin_inset Quotes cld \end_inset () \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout instance Read () where ,,, \end_layout \begin_layout Plain Layout instance Show Char where ,,, \end_layout \begin_layout Plain Layout instance Read Char where ,,, \end_layout \begin_layout Plain Layout instance (Show a) => Show [a] where showsPrec _ = showList \end_layout \begin_layout Plain Layout instance (Read a) => Read [a] where readsPrec _ = readList \end_layout \begin_layout Plain Layout instance (Show a, Show b) => Show (a, b) where ,,, \end_layout \begin_layout Plain Layout instance (Read a, Read b) => Read (a, b) where ,,, \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter Int \family default e \family typewriter Integer \family default se muestran como \family typewriter \family default en decimal, \family typewriter Float \family default y \family typewriter Double \family default como \family typewriter \family default y \family typewriter Char \family default como \family typewriter \family default en \family typewriter showsPrec \family default y \family typewriter readsPrec \family default y como \family typewriter \family default en \family typewriter showList \family default y \family typewriter readList \family default . \end_layout \end_body \end_document