La composición de funciones es una forma de encadenar dos o más funciones juntas. A menudo se compara con tuberías de concha. Por ejemplo, en una cáscara de estilo Unix, es posible escribir algo como
cat foo.txt | sort -n | less
Esto va en cat
, alimenta su salida a sort
, y alimenta la salida de aquél al less
.
Estrictamente, esto es como el operador Haskell $
. Puede escribir algo como
sum $ sort $ filter (> 0) $ my_list
Observe que, a diferencia del ejemplo de shell, esto se lee de derecha a izquierda. Así que comenzamos con my_list
como entrada, luego ejecutamos filter
sobre él, luego lo sort
, y luego calculamos el sum
de él.
El operador de composición de funciones, .
, hace algo similar. El ejemplo anterior produce un número ; el ejemplo de arriba genera una función :
sum . sort . filter (> 0)
en cuenta que en realidad no alimentar a una lista en esto. En cambio, acabamos de crear una nueva función, y podemos alimentar varias listas diferentes para esa función.Por ejemplo, es posible que el nombre de esta función:
my_function = sum . sort . filter (> 0)
O puede pasar como argumento a otra función:
map (sum . sort . filter (> 0)) my_lists
básicamente se puede usar en cualquier lugar que se puede utilizar cualquier otro tipo de función . Es solo una forma rápida y legible de decir "Quiero encadenar estas funciones juntas".
¿Cómo es que no necesita mostrar el parámetro de entrada en la definición? Por ejemplo. ¿Cómo es que no escribes 'myOdd x = not. incluso x'? – unclerojelio
@unclerojelio Se llama estilo sin puntos. En lugar de definir 'myOdd' en términos del resultado para un argumento dado (" Dado 'x',' myOdd' devuelve el mismo valor que '(not. Even) x'"), se define en términos de lo que realmente es is ("' myOdd' es la función que resulta cuando 'not' se compone con' even' "). – chepner