lunes, 26 de octubre de 2015

Es sencillo, con mónadas



---------------- Y ahora lo siguiente
main :: IO ()
main = do
  putStrLn "Cuál es tu nombre?"
  name <- getLine
  putStrLn ("Gusto en conocerte, " ++ name ++ "!")

--- main tiene tipo IO (): las acciones posibles para cambiar un mundo.
--- do permite realizar acciones secuencialmente
--- Cada acción es ejecutada dentro de la mónada

--- ¿Por qué esto tendría que ser tan difícil? ¿No es este programa una nadería en la
--- programación imperativa?

--- La respuesta es: Se requiere controlar cada efecto lateral, se requiere que el programador
--- sea consciente de cada valor de una expresión, y además se requiere que haya un orden
--- para realizar consecutivamente cada acción. En resumen, se requiere control.
--- Y es que de otra forma la programación (de computadoras) permite fácilmente, sin disciplina,
--- la creación de monstruos amorfos, gelatinosos, escurridizos y fantasmagóricos: son esos
--- programas convencionales que de pronto fallan sin saber por qué, que son difíciles de dar
--- mantenimiento, de actualizar o de ampliar. Sin control, un programador entra fácilmente en
--- un terreno minado.

Los números de Fibonacci, en una infinita lista


---Lo siguiente es una pequeña perla de la programación funcional, en Haskell:

>let fibs = 1:1:[x+y|(x,y) <- zip fibs (tail fibs)] in take 17 fibs
>[1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597]

jueves, 15 de octubre de 2015

Esta vez, Scheme

; Lo siguiente es una codificación de una interfaz ejemplificando las capacidades de
; interfaz gráficas tal como están disponibles en Racket,
; de www.racket-lang.org

mh@zas:$ cat racketNombre01.rkt
#lang racket/gui
; Creación de un diálogo

(define dialog (instantiate dialog% ("Ejemplo de diálogo")))

; Agrega un campo de texto a
(define tf (new text-field% [parent dialog] [label "Escribe tu nombre, por favor"]))

; Agrega un panel horizontal al diálogo
(define panel (new horizontal-panel% [parent dialog]
                                     [alignment '(center center)]))
; Pega un mensaje estático al diálogo
(define msg (new message% [parent dialog]
                          [label "No hay acción..."]))

; Agrega los botones de Cancel y Ok al panel horizontal
(new button% [parent panel] [label "Cancel"]
     [callback (lambda (button event)
                 (message-box "....." "NoNoNNNo  me canceles :("))])
(new button% [parent panel]
     [label "Ok"]
     [callback (lambda (button event)
                         (message-box "Respuesta"
                               (string-append "Hola  "
                                (send tf get-value)
                                )))])
(when (system-position-ok-before-cancel?)
  (send panel change-children reverse))

; Mostrar el diálogo
(send dialog show #t)


Mónadas en Haskell


---De una explicación preliminar de mónadas en Haskell
import Control.Monad
--- data Maybe t = Just t | Nothing


add :: Maybe Int -> Maybe Int -> Maybe Int
add mx my =
  case mx of
    Nothing -> Nothing
    Just x  -> case my of
                 Nothing -> Nothing
                 Just y  -> Just (x + y)

sol n =
    case n of
      2 -> 3
      4 -> 4
      5 -> 6
      _ -> 10

sol2 2 = 3
sol2 4 = 4
sol2 6 = 6
sol2 _ = 10

sol3 n | n== 2 = 3
           | n==4  = 4
           | n==5  = 6
           | otherwise = 10

add2 :: Maybe Int -> Maybe Int -> Maybe Int
add2 mx my =      
    -- Adds two values of type (Maybe Int), where each input value can be Nothing
  mx >>= (\x ->
      -- Extracts value x if mx is not Nothing
    my >>= (\y ->
     -- Extracts value y if my is not Nothing
      return (x + y)))
 -- Wraps value (x+y), returning the sum as a value of type (Maybe Int)

add3 :: Maybe Int -> Maybe Int -> Maybe Int
add3 mx my = do
  x <- mx
  y <- my
  return (x + y)

add4 :: Maybe Int -> Maybe Int -> Maybe Int
add4 = liftM2 (+)

con4 :: Maybe String -> Maybe String -> Maybe String
con4 = liftM2 (++)

lunes, 13 de abril de 2015

Cuestionario de salvamento.

Complejidad

Complejidad

Lea cuidadosamente. a**n se lee como "a elevado a la n".
  1. Se sabe que P=NP.

  2. Verdadero
    Falso

  3. Todo algoritmo ejecutable en espacio constante es lineal en tiempo total de ejecución.

  4. Falso
    Verdadero

  5. O(n) contiene O(n**2).

  6. Falso
    Verdadero

  7. Existen 2**n-2 subconjuntos propios de un conjunto de n elementos.

  8. Verdadero
    Falso

  9. Prolog es el único lenguaje de programación determinista.

  10. Falso
    Verdadero

  11. Toda función periódica de los naturales a los naturales expresa una función recursiva primitiva.

  12. Verdadero
    Falso

  13. Con f(1)=1, y f(n) = f(n-1) se tiene una función recursiva primitiva, con valor f(n)=n.

  14. Verdadero
    Falso

  15. Es bueno utilizar apuntadores en el análisis de complejidad de un algoritmo.

  16. Verdadero
    Falso

  17. El polinomio h(x) = a+b*x+c*x**2 es una función computable según Kleene.

  18. Verdadero, si a,b,c y x toman valores enteros.
    Falso, si a, b, c y x son números reales.

  19. Considera la cadena "abaaaaabbbac".

  20. Puedo formar con esto un palíndromo.
    No puedo formar un palíndromo.

Después de terminar tu cuestionario,mantén durante un periodo de tiempo la pantalla. Salva tu resultado mediante PrScr.

s

Verdadero o falso?

1) P=NP.
2). Todo algoritmo ejecutable en espacio constante es lineal en tiempo total de ejecución
3) O(n) contiene a O(n**2).
4) Existen 2**n-2 subconjuntos propios de un conjunto de n elementos.
5) Con f(1)=1,  y f(n) = f(n-1) se tiene una función recursiva primitiva, con valor f(n)=n.
6) Toda función periódica de los naturales a los naturales puede expresarse como una función recursiva primitiva.
7) Considera la cadena "abaaaaabbbac". Halla un palíndromo con los caracteres (todos) de esta cadena. 
Te costó lo mismo hallar el palíndromo que verificar que lo es.
8) Es bueno utilizar apuntadores en el análisis de complejidad de un algoritmo.
9) Es bueno utilizar Python en el análisis de complejidad de un algoritmo.
10) El polinomio h(x) = a+b*x+c*x**2 es una función computable según Kleene (a,b,c: constantes enteras, x variable entera).

jueves, 19 de marzo de 2015

Micro-repaso conceptual en relaciones, funciones e inducción

Intermedio: Relaciones, funciones e inducción

Intermedio: Relaciones, funciones e inducción

  1. ¿Es la composición de dos funciones inyectivas una función inyectiva?

  2. Sí
    No

  3. Si existe una función biyectiva entre los conjuntos A y B, estos tienen la misma cardinalidad.

  4. Sí
    No

  5. El principio de inducción matemática permite probar propiedades definidas sobre los números reales

  6. Sí
    No

  7. La conversa de una relación en unión con la relación misma es una relación simétrica.

  8. Sí
    No

  9. La relación <= (menor que o igual) es una relación de equivalencia.

  10. Sí
    No

  11. La composición de dos funciones biyectivas es una función biyectiva.

  12. Sí
    No

  13. Existen exactamente (n+1)! funciones biyectivas de un conjunto en sí mismo.

  14. Sí
    No

  15. El complemento de la relación a<b (menor que) es la relación a>b.

  16. No
    Sí

  17. Sea f(x)=1/x, con f(0)=0. Esta función es total, de R a R.

  18. Sí
    No

  19. La inducción matemática consiste en probar que para un predicado P, P(k) implica P((k+1)+1).

  20. No.
    Sí.