lunes, 7 de marzo de 2016

1.1 Estilos de programación

Estilos de programación.

Forma en que se le da forma al código fuente  
Estilo de programación (también llamado estándares de código o convención de código) es un término que describe convenciones para escribir código fuente en ciertos lenguajes de programación. El estilo de programación es frecuentemente dependiente del lenguaje de programación que se haya elegido para escribir. Por ejemplo el estilo del lenguaje de programación C variará con respecto al del lenguaje BASIC. 

La programación funcional es un estilo de programación que modela computaciones como la evaluación de las expresiones.
Introduccion a la Programacion Funcional: Haskell
En el proceso se lleva a cabo la compilación en el cual se transforma el código en algo que la maquina entiende.


ESTILO O MODELO







1.2 Evaluación de expresiones

Evaluación de expresiones


Las expresiones se evalúan de acuerdo con la precedencia de los operadores. Ante una secuencia de operadores de igual precedencia, la evaluación se realiza según el orden de escritura, de izquierda a derecha. El orden de evaluación puede modificarse usando paréntesis.
Orden de operadores:
1. Resolver paréntesis, u otros símbolos. ( )  [ ]  { }
2. Resolver exponentes o raíces.
3. Multiplicación y división de izquierda a derecha.
4. Suma y resta de izquierda a derecha.

Reducción de expresiones
La labor de un evaluador es calcular el resultado que se obtiene al simplificar una expresión utilizando las definiciones de las funciones involucradas.




Una expresión se reduce sustituyendo, en la parte derecha de la ecuación de la función, los Parámetros Formales o argumentos por los que aparecen en la llamada(también llamados Parámetros Reales o Parámetros). Cuando una expresión no pueda reducirse más, se dice que está en Forma Normal

ORDEN APLICATIVO
Se reduce siempre el término MAS INTERNO (el más anidado en la expresión). En caso de que existan varios términos a reducir (con la misma profundidad) se selecciona el que aparece más a la izquierda de la expresión. Esto también se llama “paso de parámetros por valor” , ya que ante una aplicación de una función, se reducen primero los parámetros de la función.
ORDEN NORMAL
Consiste en seleccionar el término MÁS EXTERNO (el menos anidado), y en caso de conflicto el que aparezca más a la izquierda de la expresión. Esta estrategia se conoce como “paso de parámetro por nombre o referencia”, ya que se pasan como parámetros de las funciones expresiones en vez de valores.


Evaluación PEREZOSA o LENTA (Lazy)
No se evalúa ningún elemento en ninguna función hasta que no sea necesario Las listas se almacenan internamente en un formato no evaluado La evaluación perezosa consiste en utilizar paso por nombre y recordar los valores de los argumentos ya calculados para evitar recalcularlos. También se denomina estrategia de pasos de parámetros por necesidad. Con una estrategia no estricta de la expresión doble (doble 3), la expresión (3 + 3) se calcula dos veces.


1.3 Definición de funciones

Definición de funciones.

Una función es una aplicación que toma uno o más argumentos y devuelve un valor.
 Es una correspondencia en la que cada elemento del dominio está relacionado con un único elemento de la imagen.
• Ejemplo de definición de función en Haskell:
doble x = x * x
• Notación matemática: f(a, b) + cd
• Notación Haskell: f a b + c * d
• Los paréntesis se utilizan para agrupar expresiones:
• Notación matemática: f(x, g (y))
• Notación Haskell: f x (g y)
 Las definiciones se incluyen en ficheros de texto. Se acostumbra a identificar dichos ficheros mediante el sufijo .hs.
 Los nombres de funciones tienen que empezar por una letra en minúscula.
 En Haskell la disposición del texto del programa (el sangrado) delimita las definiciones mediante la siguiente regla:
·         Una definición acaba con el primer trozo de código con un margen izquierdo menor o igual que el del comienzo de la definición actual.
·         Un comentario simple comienza con -- y se extiende hasta el final de la línea.
·         Un comentario anidado comienza con {- y termina en -}
máximo x y z=max x( max y z)  {- ejemplo de una definición y un comentario }

La manera más fácil de definir funciones es por combinación de otras funciones:
 fac n = product [1..n]
impar x = not (even x)
 cuadrado x = x*x
suma_de_cuadrados lista = sum (map cuadrado lista) 
Las funciones pueden tener más de un parámetro:
 comb n k = fac n / (fac k * fac (n-k))
formulaABC a b c = [ (-b+sqrt(b*b-4.0*a*c)) / (2.0*a)
  , (-b-sqrt(b*b-4.0*a*c)) / (2.0*a)]

 Las funciones sin parámetros se llaman normalmente constantes:
 pi = 3.1415926535
 e = exp 1.0

Toda definición de función tiene por tanto la siguiente forma:
 • El nombre de la función
• Los nombres de los parámetros (si existen)
• El símbolo =
 • una expresión, que puede contener los parámetros, las funciones estándar y otras funciones definidas. 
Una función que tiene un valor booleano como resultado, tiene a la derecha del símbolo = una expresión con un valor booleano:

negativo  x = x < 0
positivo   x = x > 0
esCero     x = x == 0
Note la diferencia en el anterior ejemplo entre =  y  ==. El símbolo = separa la parte izquierda de la parte derecha de la definición. El símbolo == es un operador, como < y >.




domingo, 6 de marzo de 2016

1.4 Disciplina de tipos

Disciplina de tipos

Los tipos se infieren, es decir se comprueban, de forma estática, en tiempo de compilación.
En los lenguajes de programación con disciplina de tipos, cada tipo representa una colección de valores (datos) similares. Una función cuyo tipo sea A1 ->… An -> R espera n parámetros con tipos A1,…. An y devuelve un resultado de tipo R. El conocer los tipos de las funciones ayuda a documentar los programas y a evitar errores en tiempo de ejecución.
Haskell y otros lenguajes funcionales utilizan el sistema de tipos de Milner, que tiene dos características fundamentales:
Disciplina estática de tipos:
Los programas bien tipados se pueden conocer en tiempo de compilación. Un programa bien tipado se puede utilizar sin efectuar comprobaciones de tipo en tiempo de ejecución, estando garantizado que no se producirán errores de tipo durante el cómputo.
Polimorfismo:
Permite que una misma función se pueda aplicar a parámetros de diferentes tipos, dependiendo del contexto en el que la función se utilice.

Un lenguaje tiene disciplina de tipos si los errores de tipos se detectan siempre es necesario determinar los tipos de todos los operandos, ya sea en tiempo de compilación o de ejecución.









1.5 Tipos de Datos

Tipos de Datos En lenguajes de programación un tipo de dato es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar.

Tipos de datos en Haskell

Los lenguajes funcionales, en particular Haskell, tienen un rico conjunto de datos atómicos predefinidos, tales como los numéricos int, integer (de mayor precisión que el anterior), float, double, etc., y además los tipos char y bool.
El sistema de tipos de Haskell es uno de los más sofisticados que existen. Es un sistema polimórfico, que permite una gran flexibilidad de programación, pero a la vez mantiene la correctitud de los programas. Contrariamente a la mayoría de los lenguajes de programación procedimentales actuales, Haskell utiliza un sistema de inferencias de tipos, es decir sabe el tipo resultante de una expresión, por lo que las anotaciones de tipo en un programa son opcionales.
La parte más interesante de Haskell en relación con los tipos son los constructores, las tuplas y las listas. Una tupla es un dato compuesto donde el tipo de cada componente puede ser distinto. Una de las utilidades de este tipo de datos es cuando una función tiene que devolver más de un valor:
predSuc :: Integer (Integer,Integer)
predSuc x = (x-1,x+1)
Las listas son colecciones de cero o más elementos de un mismo tipo (a diferencia de las tuplas que pueden tenerlos de diferentes). Los operadores utilizados son el [] y (:). El primero representa una lista vacía, y el segundo denominado cons o constructor, permite añadir un elemento al principio de una lista, construyendo la lista en función de agregar elementos a la misma, por ejemplo.

4 : 2 : 3 : []
da lugar a la lista [4, 2, 3]. Su asociatividad es hacia la derecha. Un tipo particular de lista son las cadenas de caracteres.

Para terminar diremos que el constructor utilizado para declarar el tipo correspondiente a las distintas funciones es el símbolo .



Tipos de Datos en Hakell
Tipos de datos en C#
En la tabla siguiente se proporciona la lista de tipos de datos de C# y sus alias. 
C# es un lenguaje con establecimiento inflexible de tipos. Antes de que un valor se pueda almacenar en una variable, se debe especificar el tipo de la variable, como en los ejemplos siguientes:

int a =1;
String cadena= "Hola Mundo";
Double num=3.12;....