Unidad Ii

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 58

UNIDAD II

MODELO DE
PROGRAMACIÓN
FUNCIONAL
INTRODUCCIÓN AL MODELO DE
PROGRAMACIÓN FUNCIONAL
¿QUÉ ES LA PROGRAMACIÓN FUNCIONAL?

Es un paradigma de programación declarativa basado en el uso de funciones


matemáticas.

La diferencia entre una función matemática y «función» utilizada en programación


imperativa es que esta última mencionada puede tener efectos secundarios, como
cambiar el valor de variables globales o pasadas por referencia.

Al eliminar dichos efectos secundarios, en la programación funcional, se puede


entender y predecir el funcionamiento de un programa más fácilmente, porque una
función que se invoca con los mismos parámetros siempre va a retornar el mismo
resultado.
Los lenguajes funcionales ofrecen al programador un buen número de recursos expresivos que permiten
resolver problemas complejos mediante programas pequeños y robustos.

Entre ellos cabe destacar: un sistema de tipos polimórficos que permite definir una amplia variedad de
estructuras de datos de uso genérico, la posibilidad de definir funciones que aceptan otras funciones
como argumentos y devuelven funciones como resultado, facilidades para definir y manipular estructuras
de datos infinitas, un modelo computacional simple, claro y bien fundamentado, etc.

De no menor importancia es la posibilidad de razonar, de forma sencilla, acerca de las propiedades de los
programas: su corrección, su eficacia, su comportamiento en ejecución. Esto permite optimizar las tareas
de implementación de los lenguajes funcionales.
Podemos encontrar, en casi todos los lenguajes de programación funcional, un
núcleo común de conceptos y técnicas asentado sobre bases firmemente
establecidas.

Su creación es debida a las necesidades de los investigadores en el campo de la


inteligencia artificial y en sus campos secundarios del cálculo simbólico, pruebas
de teoremas, sistemas basados en reglas y procesamiento del lenguaje natural.

La característica principal de la programación funcional es que los cálculos


se ven como una función matemática que hacen corresponder entradas y
salidas.
La programación funcional es que ‘No tiene efectos colaterales’.

La ausencia de efectos es la esencia de la programación funcional,


esto significa que una función no se mete en lo absoluto con datos
que existen fuera de ella, si puede utilizar los datos pasados como
parámetros, pero no puede modificarlos, todos los datos deben ser
inmutables. A este comportamiento se le llama funciones puras.
Sin efectos colaterales nos permite entender todas las demás características de la programación
funcional, por mencionar algunas principales:

• Funciones puras

• Inmutabilidad

• Funciones de alto nivel

• Funciones currificadas

• Recursividad

• Menos errores de programación porque no realiza efectos colaterales.


Toda función teniendo ciertos datos de entrada o parámetros, obtendremos un
resultado basado en esos parámetros, esto nos da la habilidad de predecir el
resultado, tendremos más seguridad de lo que obtendremos por lo que nuestra
programación se vuelve más entendible.

También vamos a estar seguros de que siempre obtendremos el mismo resultado


cada vez que insertemos los mismos datos, ya que una función no depende de
más datos externos de la aplicación que puedan cambiar en el tiempo.
Como aspecto práctico casi todos los lenguajes funcionales soportan el concepto
de variable, asignación y ciclos .

Estos elementos no forman parte del modelo funcional “puro”.


Cualquiera que haya usado una hoja de cálculo conoce la experiencia de la programación funcional.

En una hoja de cálculo, se especifica cada celda en términos de los valores de otras celdas.

El objetivo es que debe ser calculado y no en como debe calcularse.

Por ejemplo:
• No especificamos el orden en el que las celdas serán calculadas, en cambio obtenemos el orden que
garantiza que la hoja de cálculo puede calcular las celdas respetando las dependencias.
• No indicamos a la hoja de cálculo como manejar la memoria, en cambio esperamos que nos presente un
plano de celdas, aparentemente infinito, pero que solo utiliza la memoria de las celdas que están
actualmente en uso.
• Lo más importante, especificamos el valor de una celda por una expresión (cuyas partes pueden ser
evaluadas en cualquier orden), en vez de una secuencia de comandos que calculan los valores.
FUNCIONES PURAS E INMUTABILIDAD
Una función pura es la que cumple con estas dos características:

• Siempre obtendremos el mismo resultado dado los mismos


parámetros de entrada.

• No tiene ningún efecto colateral observable, no modifica el estado


de los datos externos, por lo que todos los datos deben ser
inmutables.
Lenguajes de Paradigma Funcional

1 LISP

2
SCHEME

3 COMMON LISP

4 Haskell
INTRODUCCIÓN A LA
PROGRAMACIÓN FUNCIONAL
EN F#
INTRODUCCION
La programación funcional es un estilo de programación que enfatiza el uso de funciones y
datos inmutables.

La programación funcional con tipo es cuando la programación funcional se combina con tipos
estáticos, F# como con. En general, los conceptos siguientes se destacan en la programación
funcional:

✓ Funciona como construcciones principales que se usan

✓ Expresiones en lugar de instrucciones

✓ Valores inmutables en variables

✓ Programación declarativa a través de la programación imperativa


TERMINOLOGÍA
La programación funcional, al igual que otros paradigmas de programación, incluye un
vocabulario que finalmente tendrá que aprender. Estos son algunos de los términos
comunes que verá todo el tiempo:

Función

Una función es una construcción que generará una salida cuando se proporcione una
entrada. Más formalmente, asigna un elemento de un conjunto a otro conjunto. Este
formalismo se eleva en concreto de muchas maneras, especialmente cuando se usan
funciones que operan en colecciones de datos. Es el concepto más básico (y
importante) de la programación funcional.
TERMINOLOGÍA
Expresión

Una expresión es una construcción de código que genera un valor. En F#, este
valor debe estar enlazado o omitirse explícitamente. Una expresión se puede
reemplazar trivialmente por una llamada de función.

La pureza-pureza

Es una propiedad de una función de modo que el valor devuelto sea siempre
el mismo para los mismos argumentos, y que su evaluación no tenga efectos
secundarios. Una función pura depende completamente de sus argumentos.
TERMINOLOGÍA
Transparencia referencial

La transparencia referencial es una propiedad de expresiones de modo que


se pueden reemplazar por su salida sin afectar al comportamiento de un
programa.

Inmutabilidad

La inmutabilidad significa que un valor no se puede cambiar en contexto.


Esto contrasta con las variables, que pueden cambiar en su lugar..
TERMINOLOGÍA

F# es un lenguaje de programación funcional que facilita la


escritura de código correcto y fácil de mantener.

F# la programación implica principalmente definir tipos y


funciones que se infieren de tipo y se generalizan
automáticamente. Esto permite que el foco permanezca en el
dominio del problema y manipule sus datos, en lugar de los
detalles de la programación
F# tiene numerosas características, entre las que se incluyen:

✓ Sintaxis ligera

✓ Inmutable de forma predeterminada

✓ Inferencia de tipos y generalización automática

✓ Funciones de primera clase

✓ Tipos de datos eficaces

✓ Detección de patrones

✓ Programación asincrónica
F# es un lenguaje de programación:

Fuertemente tipado

Multiparadigma

“Functional-First”

De código abierto

Multiplataforma
PRINCIPALES
CARACTERÍSTICAS
Inferencia de tipos:

Pese a que F# es un lenguaje fuertemente tipado, los


tipos de objetos no necesitan ser declarados
explícitamente ya que son inferidos por el compilador en
base al valor asignado al objeto.
Funciones como valores:

F# permite hacer con funciones todo lo que se puede hacer con los
valores de forma sencilla tales como asignación como parámetro,
almacenamiento en estructuras o funciones cruzadas
Uso de expresiones lambda:

Las expresiones lambda son especialmente útiles para


operar en colecciones a la vez que se ahorra la declaración
de una función, y tienen esta forma:
Generalización automática:

El compilador analiza cada parámetro en una función dada y determina si la


función tiene dependencia de un tipo específico de dato.

La función max permite la generalización de sus parámetros ya que los


operadores de la función no hacen uso de un tipo específico.
Aplicación parcial de argumentos:

Mediante el método de control de argumentos "currificación“ si


se proporciona a una función un número menor de argumentos
que el esperado se creará una nueva función que espera los
argumentos restantes.
Se definen las funciones que recogen la longitud como argumento restante:

Se proporciona el argumento adicional para diversas longitudes:


EJEMPLOS DE FUNCIONES

La construcción más común y fundamental en la


programación funcional es la función. Esta es una función
simple que suma 1 a un entero:

let addOne x = x + 1

Su signatura de tipo es la siguiente:

val addOne: x:int -> int


EJEMPLOS DE FUNCIONES

val addOne: x:int -> int

“addOne” acepta un int denominado x y generará un int

addOne está asignando un valor del conjunto de enteros al


conjunto de enteros.

El token -> significa esta asignación.


TABLA DE PALABRAS
CLAVE DE F #
Palabra clave Vínculo Descripción
abstract Miembros Indica un método que no tiene ninguna implementación en el
tipo en el que se declara o que es virtual y tiene una
Clases abstractas implementación predeterminada.

and let Enlaces Se utiliza en enlaces y registros recursivos mutuamente, en las


declaraciones de propiedad y con varias restricciones en los
Registros parámetros genéricos.

Miembros

Restricciones
as Clases Se utiliza para asignar un nombre de objeto al objeto de clase
actual. También se usa para asignar un nombre a un patrón entero
Coincidencia de patrones dentro de una coincidencia de patrones.

assert Aserciones Se utiliza para comprobar el código durante la depuración.


Palabra clave Vínculo Descripción
base Clases Se utiliza como el nombre del objeto de la clase
base.
Herencia

begin Sintaxis detallada En la sintaxis detallada, indica el inicio de un bloque


de código.

class Clases En la sintaxis detallada, indica el inicio de una


definición de clase.

default Miembros Indica una implementación de un método


abstracto; se utiliza junto con una declaración de
método abstracto para crear un método virtual.
Palabra clave Vínculo Descripción

delegate Delegados Se usa para declarar un delegado.

do do (Enlaces) Se utiliza en construcciones de bucle o


Bucles: expresión for...to para ejecutar código imperativo.

Bucles: expresión for...in

Bucles:
expresión while...do
done Sintaxis detallada En la sintaxis detallada, indica el final de un
bloque de código en una expresión de
bucle.
Palabra clave Vínculo Descripción
downcast Conversiones Se usa para convertir a un tipo que está más
abajo en la cadena de herencia.

downto Bucles: En una for expresión, se utiliza al contar en


expresión for...to orden inverso.

elif Expresiones Se usa en la bifurcación condicional. Forma


condicionales: if...then. abreviada de else if .
..else

else Expresiones Se usa en la bifurcación condicional.


condicionales: if...then.
..else
Palabra clave Vínculo Descripción
end Estructuras En definiciones de tipo y extensiones de tipo, indica el
final de una sección de definiciones de miembros.
Uniones discriminadas
En la sintaxis detallada, se usa para especificar el final
Registros
de un bloque de código que comienza con
Extensiones de tipo la begin palabra clave.

Sintaxis detallada
exception Control de excepciones Se utiliza para declarar un tipo de excepción.

Tipos de excepción

extern Funciones externas Indica que un elemento de programa declarado está


definido en otro binario o ensamblado.
Palabra clave Vínculo Descripción
false Tipos primitivos Se usa como un literal booleano.

finally Excepciones: Se usa junto con try para introducir un bloque de


la try...finally expresión código que se ejecuta independientemente de si se
produce una excepción.

fixed Resuelto Se usa para "anclar" un puntero en la pila para


impedir que se recopile el elemento no utilizado.

for Bucles: expresión for...to Se utiliza en construcciones de bucle.

Bucles: expresión for...in


Palabra clave Vínculo Descripción
fun Expresiones Se usa en expresiones lambda, también conocidas
lambda: fun palabra como funciones anónimas.
clave

function Expresiones de Se usa como una alternativa más corta a


coincidencia la fun palabra clave y una match expresión en una
expresión lambda que tiene coincidencia de patrones
Expresiones lambda:
en un solo argumento.
palabra clave Fun
global Espacios de nombres Se usa para hacer referencia al espacio de nombres
.NET de nivel superior.

if Expresiones Se usa en construcciones de bifurcación condicional.


condicionales: if...then...el
se
Palabra clave Vínculo Descripción
in Bucles: expresión for...in Se usa para las expresiones de secuencia y, en la sintaxis
detallada, para separar las expresiones de los enlaces.
Sintaxis detallada

inherit Herencia Se utiliza para especificar una clase base o una interfaz base.

inline Funciones Se usa para indicar una función que debe integrarse
directamente en el código del llamador.
Funciones insertadas

interface Interfaces Se usa para declarar e implementar interfaces.


TABLA DE
SÍMBOLOS Y
OPERADORES
SÍMBOLO U OPERADOR VÍNCULOS DESCRIPCIÓN

!
Celdas de referencia De referencia una celda de referencia.
Expresiones de cálculo Después de una palabra clave, indica una
versión modificada del comportamiento de
la misma, controlado por un flujo
de trabajo.

!=
No se utiliza en F#. Utilice <> para las
operaciones de desigualdad.


Literales Delimita una cadena de texto.
Cadenas


Cadenas Delimita una cadena de texto literal. Se
diferencia de @"..." en que puede
indicar un carácter de comilla mediante
el uso de comillas simples en la cadena.

#
Directivas de compilador Prefija una directiva de compilador o
Tipos flexibles preprocesador, como #light .
Cuando se usa con un tipo, indica un tipo
flexible, que hace referencia a un tipo o a
cualquiera de sus tipos derivados.
SÍMBOLO U OPERADOR VÍNCULOS DESCRIPCIÓN

$
Se utiliza internamente para determinados
nombres de variable y función generados
por el compilador.

%
Operadores aritméticos Calcula el resto entero.
Expresiones de código Se utiliza para ensamblar expresiones en
delimitadas expresiones de código delimitadas con tipo.

%%
Expresiones de código Se utiliza para ensamblar expresiones en
delimitadas expresiones de código delimitadas sin tipo.

%?
Operadores que aceptan Calcula el resto entero, cuando el lado
valores NULL derecho es un tipo que acepta valores NULL.

&
Expresiones de coincidencia Calcula la dirección de un valor mutable para
usarlo al interoperar con otros lenguajes.
Se utiliza en los patrones AND.

&&
Operadores booleanos Calcula la operación AND booleana.

&&&
Operadores bit a bit Calcula la operación AND bit a bit.
SÍMBOLO U OPERADOR VÍNCULOS DESCRIPCIÓN


Literales Delimita un literal de carácter único.
Generalización automática Indica un parámetro de tipo genérico.

‘ ’. . .’ ‘
Delimita un identificador que de otro modo
no sería un identificador válido, como una
palabra clave de lenguaje.

( )
Unit (Tipo) Representa el valor único del tipo de unidad.

( ... )
Tuplas Indica el orden en que se evalúan las
Sobrecarga de operadores expresiones.
Delimita una tupla.
Se utiliza en las definiciones de operador.

( * . . . *)
Delimita un comentario que podría abarcar
varias líneas.

(|...|)
Patrones activos Delimita un modelo activo.
También se denominan delimitadores de
modelo activo
SÍMBOLO U OPERADOR VÍNCULOS DESCRIPCIÓN

*
Operadores aritméticos Cuando se utiliza como un operador binario,
Tuplas multiplica los lados izquierdo y derecho.
Unidades de medida En los tipos, indica el emparejamiento en una
tupla. Se utiliza en unidades de medida de tipos

*?
Operadores que Multiplica los lados izquierdo y derecho, si el lado
aceptan valores NULL derecho es un tipo que acepta valores NULL.

**
Operadores aritméticos Calcula la operación de exponenciación ( x ** y
significa x elevado a la potencia de y ).

+
Operadores aritméticos Si se utiliza como un operador binario, suma los
lados izquierdo y derecho.
Cuando se utiliza como un operador unario, indica
una cantidad positiva. (Formalmente, genera el
mismo valor sin modificar el signo)

+?
Operadores que Suma los lados izquierdo y derecho, si el lado
aceptan valores NULL derecho es un tipo que acepta valores NULL.

,
Tuplas Separa los elementos de una tupla o los
parámetros de tipo.
FUNCIONES
FUNCIONES
Al igual que en otros lenguajes, una función de F# tiene un nombre,
puede tener parámetros y tomar argumentos, y tiene un cuerpo.

F# también admite construcciones de programación funcional como


el tratamiento de las funciones como valores, el uso de funciones sin
nombre en expresiones, la composición de funciones para crear
nuevas funciones, funciones currificadas y la definición implícita de
funciones mediante la aplicación parcial de argumentos de función.
Las funciones se definen mediante la palabra clave let , o bien, si la función es recursiva, la combinación de palabras
clave let rec

Sintaxis

// Non-recursive function definition.

let [inline] function-name parameter-list [ : return-type ] = function-body

// Recursive function definition.

let rec function-name parameter-list = recursive-function-body

• El nombre de la función es un identificador que representa la función.


• La lista de parámetros consta de parámetros sucesivos separados por espacios. Se puede especificar un tipo
explícito para cada parámetro, tal como se describe en la sección Parámetros. Si no se especifica un tipo de
argumento concreto, el compilador intenta deducir el tipo del cuerpo de la función.
• El cuerpo de la función consta de una expresión. La expresión que forma el cuerpo de la función suele ser una
expresión compuesta formada por varias expresiones que culminan en una expresión final que es el valor
devuelto.
• El tipo de valor devuelto es un signo de dos puntos seguido de un tipo y es opcional. Si no se especifica
explícitamente el tipo del valor devuelto, el compilador determina el tipo de valor devuelto a partir de la expresión
final.
Una definición de función simple es similar a la siguiente:

let f x = x + 1

En el ejemplo anterior, el nombre de función es f , el argumento es x , que tiene el tipo int , el cuerpo de la función
es x + 1 y el valor devuelto es de tipo int .

Las funciones se pueden marcar como inline .


Ámbito
En cualquier nivel de ámbito distinto al ámbito de módulo, no es un error volver a usar un nombre de función o valor. Si se vuelve a usar
un nombre, el último nombre declarado prevalece sobre el declarado anteriormente. Pero en el ámbito de nivel superior en un módulo,
los nombres deben ser únicos.

Por ejemplo, el código siguiente produce un error cuando aparece en el ámbito de módulo, pero no cuando aparece dentro de una
función:

let list1 = [ 1; 2; 3]
// Error: duplicate definition.
let list1 = []
let function1 =
let list1 = [1; 2; 3]
let list1 = []
List1

Pero el código siguiente es aceptable en cualquier nivel de ámbito:


let list1 = [ 1; 2; 3]
// OK: inner list1 hides the outer list1.
let sumPlus x =let list1 = [1; 5; 10]
x + List.sum list1
Parámetros
Pero el código siguiente es aceptable en cualquier nivel de ámbito:
Los nombres de los parámetros aparecen después del nombre de función. Se puede especificar un tipo para un
parámetro, como se muestra en el ejemplo siguiente:

let f (x : int) = x + 1

Si se especifica un tipo, sigue al nombre del parámetro y se separa del nombre mediante dos puntos. Si se omite el tipo
del parámetro, el compilador infiere el tipo de parámetro. Por ejemplo, en la siguiente definición de función, se deduce
que el argumento x es del tipo int porque 1 es de tipo int .

let f x = x + 1

Pero el compilador intentará que la función sea lo más genérica posible. Por ejemplo, observe el código siguiente:

let f x = (x, x)

La función crea una tupla a partir de un argumento de cualquier tipo. Dado que no se especifica el tipo, la función se
puede usar con cualquier tipo de argumento.
Cuerpo de la función
El cuerpo de una función puede contener definiciones de variables locales y funciones.

Estas variables y funciones están en ámbito en el cuerpo de la función actual, pero no fuera de ella.

Una vez habilitada la opción de sintaxis ligera, se debe usar sangría para indicar que es una definición de un cuerpo de
función, como se muestra en el ejemplo siguiente:

let cylinderVolume radius length =


// Define a local value pi.
let pi = 3.14159
length * pi * radius * radius
Valores Devueltos
El compilador usa la expresión final en el cuerpo de una función para determinar el tipo y el valor devuelto. Es posible que el
compilador deduzca el tipo de la expresión final a partir las expresiones anteriores.

En la función cylinderVolume , como se muestra en la sección anterior, el tipo de pi se determina a partir del tipo del literal 3.14159
como float .

El compilador usa el tipo de pi para determinar el tipo de la expresión h * pi * r * r como float . Por tanto, el tipo de valor devuelto
global de la función es float.

Para especificar explícitamente el valor devuelto, escriba el código de esta forma:

let cylinderVolume radius length : float =


// Define a local value pi.
let pi = 3.14159
length * pi * radius * radius

Tal como se escribe el código anterior, el compilador aplica float a toda la función. Si también quiere aplicarlo a los tipos de
parámetro, use el código siguiente:

let cylinderVolume (radius : float) (length : float) : float


Llamar a una función
Las funciones se llaman especificando el nombre de la función seguido de un espacio y, después, los argumentos
separados por espacios. Por ejemplo, para llamar a la función cylinderVolume y asignar el resultado al valor vol, se
escribe el código siguiente:

let vol = cylinderVolume 2.0 3.0


Aplicación parcial de argumentos
Si se proporcionan menos argumentos que los especificados, se crea una nueva función que espera los argumentos restantes. Este método de
control de argumentos se conoce como currificación y es una característica de los lenguajes de programación funcionales como F#. Por ejemplo,
supongamos que está trabajando con dos tamaños de canalización: una tiene un radio de 2,0 y la otra tiene un radio de 3,0. Se podrían crear
funciones que determinen el volumen de canalización de esta forma:
let smallPipeRadius = 2.0
let bigPipeRadius = 3.0
// These define functions that take the length as a remaining
// argument:
let smallPipeVolume = cylinderVolume smallPipeRadius
let bigPipeVolume = cylinderVolume bigPipeRadius
Después, se proporcionaría el argumento adicional según sea necesario para las distintas longitudes de canalización de los dos tamaños
diferentes:
let length1 = 30.0
let length2 = 40.0
let smallPipeVol1 = smallPipeVolume length1
let smallPipeVol2 = smallPipeVolume length2
let bigPipeVol1 = bigPipeVolume length1
let bigPipeVol2 = bigPipeVolume length2
Funciones recursivas
Las funciones recursivas son funciones que se llaman a sí mismas. Requieren que se especifique la palabra clave
rec después de la palabra clave let. La función recursiva se invoca desde el interior del cuerpo de la función de
la misma forma que se invocaría cualquier llamada de función. La siguiente función recursiva calcula el número
n de Fibonacci. La secuencia de números de Fibonacci se conoce desde la antigüedad y es una secuencia en la
que cada número sucesivo es la suma de los dos números anteriores en la secuencia.

let rec fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2)

Es posible que algunas funciones recursivas desborden la pila del programa o tengan un rendimiento ineficaz si
no se escriben con cuidado y con el conocimiento de determinadas técnicas especiales, como el uso de
acumuladores y continuaciones
Valores de función
En F#, todas las funciones se consideran valores, de hecho, se conocen como valores de función. Dado que las funciones son valores, se pueden
usar como argumentos de otras funciones o en otros contextos donde se usan los valores. El siguiente ejemplo muestra una función que toma
un valor de función como argumento:

let apply1 (transform : int -> int ) y = transform y

El tipo de un valor de función se especifica mediante el token -> . En el lado izquierdo de este token está el tipo del argumento y, en el lado
derecho, el valor devuelto. En el ejemplo anterior, apply1 es una función que toma una función transform como argumento, donde transform es
una función que toma un entero y devuelve otro entero. En el código siguiente se muestra cómo usar apply1 :

let increment x = x + 1
let result1 = apply1 increment 100
El valor de result será 101 después de ejecutar el código anterior. Si hay varios argumentos, se separan por sucesivos tokens -> , como se
muestra en el ejemplo siguiente:

let apply2 ( f: int -> int -> int) x y = f x y


let mul x y = x * y
let result2 = apply2 mul 10 20
El resultado es 200.
Expresiones lambda
Una expresión lambda es una función sin nombre. En los ejemplos anteriores, en lugar de definir las
funciones con nombre increment y mul, se podrían usar expresiones lambda de esta forma:

let result3 = apply1 (fun x -> x + 1) 100


let result4 = apply2 (fun x y -> x * y ) 10 20

Las expresiones lambda se definen mediante la palabra clave fun . Una expresión lambda es similar
a una definición de función, salvo que en lugar del token = se usa el token -> para separar la lista
de argumentos del cuerpo de la función. Al igual que en una definición de función normal, se
pueden deducir o especificar explícitamente los tipos de argumento, y el tipo de valor devuelto de
la expresión lambda se deduce del tipo de la última expresión en el cuerpo. Para obtener más
información, vea Expresiones lambda: Palabra clave fun .
Composición de funciones y canalización
En F#, las funciones se pueden componer a partir de otras funciones. La composición de dos funciones función1 y función2 es otra
función que representa la aplicación de función1 seguida de la aplicación de función2:

let function1 x = x + 1
let function2 x = x * 2
let h = function1 >> function2
let result5 = h 100
El resultado es 202.

La canalización permite encadenar llamadas a funciones como operaciones sucesivas. La canalización funciona de la siguiente manera:
let result = 100 |> function1 |> function2
El resultado es 202 de nuevo.

Los operadores de composición toman dos funciones y devuelven una función. Por el contrario, los operadores de canalización toman
una función y un argumento, y devuelven un valor. En el ejemplo de código siguiente se muestra la diferencia entre los operadores de
canalización y composición mostrando las diferencias en las firmas de función y el uso.

También podría gustarte