#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. 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 y \family typewriter (a,b,c) \family default implementan \family typewriter Eq \family default , \family typewriter Ord \family default y \family typewriter Bounded \family default como se indica, y \family typewriter () \family default también implementa \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 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 , \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 :: a \end_layout \begin_layout Plain Layout 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 -- until p f aplica f hasta que se cumple p \end_layout \begin_layout Plain Layout | 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 = if signum r == - signum d \end_layout \begin_layout Plain Layout then (q-1, r+d) \end_layout \begin_layout Plain Layout else (q, r) \end_layout \begin_layout Plain Layout where (q, r) = quotRem n d \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 \end_inset \end_layout \begin_layout Standard \begin_inset Newpage pagebreak \end_inset \begin_inset listings inline false status open \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 0 0 = undefined \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 Standard \begin_inset Note Note status open \begin_layout Plain Layout Complex, read \end_layout \begin_layout Plain Layout Eq a => Eq [a] \end_layout \begin_layout Plain Layout Ord a => Ord [a] \end_layout \begin_layout Plain Layout putStr \end_layout \end_inset \end_layout \end_body \end_document