quiero definir una función que calcula el número de elementos en una lista que satisfacen un predicado dado:Número de elementos en Haskell en el estilo pointfree
number_of_elements :: (a -> Bool) -> [a] -> Int
number_of_elements f xs = length (filter f xs)
Por ejemplo:
number_of_elements (==2) [2,1,54,1,2]
debe return .
Podemos escribir más corto:
number_of_elements f = length . filter f
¿Es posible escribir sin f parámetro?
Qué estas buscando se llama "estilo Pointfree". Hay una wiki sobre esto aquí: http://www.haskell.org/haskellwiki/Pointfree. Te enseña todos los trucos como el búho: '((.) $ (.))' Y el punto: '((.). (.))'. Yo personalmente no recomendaría este estilo. –
Recomiendo jugar un poco con él, para ver cómo funciona, pero usando el estilo parcialmente libre 'number_of_elements f = length. filtro f'. Esa es la más legible por lo general. –
Esta es una función que raramente me molestaría en definir, porque 'length (filter f xs)' es, francamente, más fácil de leer que 'number_of_elements f xs'. Esto último me obliga a averiguar qué hace tu función al buscar tu definición de función, la documentación o inferirla del tipo; mientras que el primero es un uso combinado directo de dos funciones que ya entiendo, ¡y también es más corto de escribir! Solo definiría esto como una función auxiliar en un enlace 'where', o como una función de módulo no exportado, e incluso solo si va a ser el argumento para otras funciones. –