aboutsummaryrefslogtreecommitdiff
path: root/pia/n5.lyx
diff options
context:
space:
mode:
authorJuan Marin Noguera <juan@mnpi.eu>2022-11-16 12:08:19 +0100
committerJuan Marin Noguera <juan@mnpi.eu>2022-12-04 13:20:36 +0100
commit3e9874f10d8a4aa42d048f2f387b7f35942e2c4f (patch)
treee2414e069b2799a0e75ed32fd94ece6405d7f3a5 /pia/n5.lyx
parentff62f76ee6a763e275a6e05eb87d842d843fc374 (diff)
PIA tema 5
Diffstat (limited to 'pia/n5.lyx')
-rw-r--r--pia/n5.lyx1876
1 files changed, 1876 insertions, 0 deletions
diff --git a/pia/n5.lyx b/pia/n5.lyx
new file mode 100644
index 0000000..40309cd
--- /dev/null
+++ b/pia/n5.lyx
@@ -0,0 +1,1876 @@
+#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
+
+infix 4 ==, /=, <, <=, >=, >
+\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`
+\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
+\end_layout
+
+\begin_layout Plain Layout
+
+ toEnum :: Int -> a
+\end_layout
+
+\begin_layout Plain Layout
+
+ fromEnum :: a -> Int
+\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
+\family typewriter
+toEnum
+\emph on
+a
+\family default
+\emph default
+ devuelve
+\begin_inset Formula $\bot$
+\end_inset
+
+ para una entrada no definida.
+
+\family typewriter
+fromEnum
+\family default
+ es la inversa de
+\family typewriter
+toEnum
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Note Comment
+status open
+
+\begin_layout Plain Layout
+succ, pred, enumFrom, enumThen, enumFromTo, enumFromThenTo
+\end_layout
+
+\end_inset
+
+
+\begin_inset Note Comment
+status open
+
+\begin_layout Plain Layout
+enumFrom y enumFromThen se definen de forma especial.
+\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, (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
+
+\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, sinh, cosh,
+\end_layout
+
+\begin_layout Plain Layout
+
+ 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
+
+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
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Tipos numéricos
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\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
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+instance Enum Float where
+\end_layout
+
+\begin_layout Plain Layout
+
+ toEnum = fromIntegral
+\end_layout
+
+\begin_layout Plain Layout
+
+ fromEnum = fromInteger .
+ truncate
+\end_layout
+
+\begin_layout Plain Layout
+
+instance Enum Double where
+\end_layout
+
+\begin_layout Plain Layout
+
+ toEnum = fromIntegral
+\end_layout
+
+\begin_layout Plain Layout
+
+ fromEnum = fromInteger .
+ truncate
+\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
+Mónadas
+\end_layout
+
+\begin_layout Standard
+\begin_inset Note Comment
+status open
+
+\begin_layout Plain Layout
+fail, sequence, sequence_, mapM, mapM_, (=<<)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+class Functor f where
+\end_layout
+
+\begin_layout Plain Layout
+
+ fmap :: (a -> b) -> f a -> f b
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+class Monad m where {#- MINIMAL (>>=), return -#}
+\end_layout
+
+\begin_layout Plain Layout
+
+ (>>=) :: m a -> (a -> m b) -> m b
+\end_layout
+
+\begin_layout Plain Layout
+
+ (>>) :: m a -> m b -> m b
+\end_layout
+
+\begin_layout Plain Layout
+
+ return :: a -> m a
+\end_layout
+
+\begin_layout Plain Layout
+
+\end_layout
+
+\begin_layout Plain Layout
+
+ m >> k = m >>=
+\backslash
+_ -> k
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Tipos monádicos
+\end_layout
+
+\begin_layout Standard
+\begin_inset listings
+inline false
+status open
+
+\begin_layout Plain Layout
+
+data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)
+\end_layout
+
+\begin_layout Plain Layout
+
+data IO a = ...
+\end_layout
+
+\begin_layout Plain Layout
+
+instance Monad IO where ...
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Note Comment
+status open
+
+\begin_layout Plain Layout
+Maybe, maybe, either, instance Functor IO, instance Monad IO, instance Functor
+ [], instance Monad []
+\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