diff options
| author | Juan Marin Noguera <juan@mnpi.eu> | 2022-11-16 12:08:19 +0100 |
|---|---|---|
| committer | Juan Marin Noguera <juan@mnpi.eu> | 2022-12-04 13:20:36 +0100 |
| commit | 3e9874f10d8a4aa42d048f2f387b7f35942e2c4f (patch) | |
| tree | e2414e069b2799a0e75ed32fd94ece6405d7f3a5 /pia/n5.lyx | |
| parent | ff62f76ee6a763e275a6e05eb87d842d843fc374 (diff) | |
PIA tema 5
Diffstat (limited to 'pia/n5.lyx')
| -rw-r--r-- | pia/n5.lyx | 1876 |
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 |
