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. Esto incluye imponer restricciones en los datos,
como qué valores pueden tomar y qué operaciones se pueden realizar. Tipos de datos comunes
son: enteros, números de coma flotante (decimales), cadenas alfanuméricas, fechas, horas,
colores, etc.
Por ejemplo, por lo general el tipo "int" representa un conjunto de enteros de 32 bits cuyo rango
va desde el -2.147.483.648 al 2.147.483.647, así como las operaciones que se pueden realizar con
los enteros, como son la suma, la resta, y la multiplicación. Los colores, por su parte, se
representan como tres bytes denotando la cantidad de rojo, verde y azul, y una cadena de
caracteres representando el nombre del color; las operaciones permitidas en este caso incluyen la
adición y la sustracción, pero no la multiplicación.
En un sentido amplio, un tipo de datos define un conjunto de valores y las operaciones sobre estos
valores. casi todos los lenguajes de programación explícitamente incluyen la notación del tipo de
datos, aunque lenguajes diferentes pueden usar terminologías diferentes. La mayor parte de los
lenguajes de programación permiten al programador definir tipos de datos adicionales,
normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del
nuevo tipo de dato. por ejemplo, un programador puede crear un nuevo tipo de dato llamado
"persona" que específica que el dato interpretado como persona incluirá, por ejemplo, un nombre
y una fecha de nacimiento.
Un tipo de dato puede ser también visto como una limitación impuesta en la interpretación de los
datos en un sistema de tipificación, describiendo la representación.
La interpretación y la estructura de los valores u objetos almacenados en la memoria del
ordenador. El sistema de tipificación usa información de los tipos de datos para comprobar
la verificación de los programas que acceden o manipulan los datos.
2.3. FUNCIONES
Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones
de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino
como funciones puramente matemáticas, en las que se verifican ciertas propiedades como
la transparencia referencial (el significado de una expresión depende únicamente del significado
de sus sobrexpresiones) y, por tanto, la carencia total de efectos colaterales.
Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los híbridos. La
diferencia entre ambos estriba en que los lenguajes funcionales híbridos son menos dogmáticos
que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de
instrucciones o la asignación de variables. En contraste, los lenguajes funcionales puros tienen una
mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se
cumple siempre con un lenguaje funcional híbrido.
Funciones de orden superior son funciones que pueden tomar otras funciones como argumentos o
devolverlos como resultados. En cálculo, un ejemplo de una función de orden superior es el
operador diferencial d / dx, que devuelve la derivada de una función f.
Las funciones de orden superior están estrechamente relacionadas con las funciones de primera
clase en las cuales las funciones de orden superior y las funciones de primera clase pueden recibir
como argumentos y resultados otras funciones. La distinción entre los dos es sutil: "de orden
superior", describe un concepto matemático de funciones que operan sobre otras funciones,
mientras que la "primera clase" es un término informático que describe las entidades del lenguaje
de programación que no tienen ninguna restricción de su utilización (por lo tanto funciones de
primera clase pueden aparecer en cualquier parte del programa que otras entidades de primer
nivel como los números pueden, incluidos como argumentos a otras funciones y como sus valores
de retorno).
Las funciones de orden superior permiten la aplicación parcial, una técnica en la que se aplica una
función a sus argumentos uno a la vez, con cada aplicación devolver una nueva función que acepta
el siguiente argumento. Esto le permite a uno expresar, por ejemplo, la función sucesora como el
operador de suma aplicada parcialmente al número natural uno.
Funciones puras
· Si no se utiliza el resultado de una expresión pura, se puede eliminar sin afectar a otras
expresiones.
· Si una función pura se llama con parámetros que no causan efectos secundarios, el resultado es
constante con respecto a la lista de parámetros (a veces llamada transparencia referencial), es
decir, si la función pura se llama de nuevo con los mismos parámetros, el mismo resultado será
devuelto (esto puede habilitar las optimizaciones de almacenamiento en caché).
· Si no hay una dependencia de datos entre dos expresiones puras, entonces su orden puede ser
invertido, o pueden llevarse a cabo en paralelo y que no pueda interferir con los otros.
2.4. INTERVALOS
El intervalo de una variable está definido como la diferencia entre el valor más alto y el valor más
bajo que esa variable puede guardar.
En el caso de una variable entera, el intervalo cubrirá todos los números dentro de su intervalo
(incluyendo el máximo y el mínimo).
En el caso de una variable entera, la definición está restringida a números enteros, y el intervalo
cubrirá todos los números dentro de su intervalo (incluyendo el máximo y el mínimo).
En programación funcional pura una vez declarada una variable no se puede modificar su valor.
Cuando se realiza una asignación de un valor a una variable debemos considerar que estamos
dando un nombre a un objeto matemático que no puede ser modificado o que estamos copiando
el valor en la variable.
Por ejemplo, en java, los tipos de datos primitivos son valores. las asignaciones valores de estos
tipos a variables realizan copias de valores:
Los tipos de datos cuyos valores son inmutables y sus asignaciones tienen una semántica de copia
reciben el nombre de tipos de valor (value types en inglés).
Los tipos de referencia son tipos de datos mutables en los que la asignación funciona con
semántica de referencia.
Por ejemplo, cualquier objeto en java tiene una semántica de referencia. Cuando asignamos un
objeto a una variable, estamos guardando en la variable una referencia al objeto.
Una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para
implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se
guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior
o posterior. El principal beneficio de las listas enlazadas respecto a los vectores convencionales es
que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la
memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de
almacenamiento.
Las listas enlazadas permiten inserciones y eliminación de nodos en cualquier punto de la lista en
tiempo constante (suponiendo que dicho punto está previamente identificado o localizado), pero
no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: listas enlazadas
simples, listas doblemente enlazadas, listas enlazadas circulares y listas enlazadas doblemente
circulares.
algunas funciones:
componentes:
Los parámetros, que son los valores que recibe la función como entrada
El código de la función, que son las operaciones que hace la función el resultado (o valor
de retorno), que es el valor final que entrega la función.
2.7. ARBOLES
En informática un árbol es una estructura de datos ampliamente usada que imita la forma de un
árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol
y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo es padre de un nodo si
existe un enlace desde hasta (en ese caso, también decimos que es hijo de). Sólo puede haber un
único nodo sin padres, que llamaremos raíz. un nodo que no tiene hijos se conoce como hoja. Los
demás nodos (tienen padre y uno o varios hijos) se les conoce como rama.
· Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).
· Un nuevo árbol a partir de un nodo y árboles de raíces con elementos cada uno, puede
construirse estableciendo una relación padre-hijo entre y cada una de las raíces de los árboles. El
árbol resultante de nodos tiene como raíz el nodo, los nodos son los hijos de y el conjunto de
nodos hoja está formado por la unión de los conjuntos hojas iniciales. A cada uno de los árboles se
les denota ahora subárboles de la raíz.
· Como ayuda para realizar búsquedas en conjuntos de datos (ver también: algoritmos de
búsqueda en Árboles).
La evaluación perezosa puede también reducir el consumo de memoria de una aplicación, ya que
los valores se crean solo cuando se necesitan. Sin embargo, es difícil de combinar con las
operaciones típicas de programación imperativa, como el manejo de excepciones o las
operaciones de entrada/salida, porque el orden de las operaciones puede quedar indeterminado.
Además, la evaluación perezosa puede conducir a fragmentar la memoria.
Conclusión:
Vemos que en esta unidad nos habla lo que es la programación funcional, que es un paradigma
basado en la utilización de funciones aritméticas. La programación funcional tiene sus raíces en
el cálculo lambda, un sistema formal desarrollado en los años 1930 para investigar la definición de
función, la aplicación de las funciones y la recursión. Muchos lenguajes de programación
funcionales pueden ser vistos como elaboraciones del cálculo lambda.
Los lenguajes de programación funcional, especialmente los que son puramente funcionales, han
sido enfatizados en el ambiente académico principalmente y no tanto en el desarrollo de software
comercial.
Sin embargo, lenguajes de programación importantes tales como scheme,erlang, rust, objective
caml y haskell, han sido utilizados en aplicaciones comerciales e industriales por muchas
organizaciones.