Возможно, вы захотите прочитать о Семантическом редакторе комбинаторов .Возьмите оттуда комбинатор result
:
result :: (output -> output') -> (input -> output) -> (input -> output')
result = (.)
Комбинатор result
берет функцию и применяет ее к результату другой функции.Теперь, посмотрев на функции, которые у нас есть:
filter :: (a -> Bool) -> [a] -> [a]
length :: [a] -> Int
Теперь length
относится к [a]
;который, случается, является типом результата функций вида foo :: [a] -> [a]
.Итак,
result length :: ([a] -> [a]) -> ([a] -> Int)
Но результат filter
является в точности функцией [a] -> [a]
, поэтому мы хотим применить result length
к результату filter
:
number_of_elements = result (result length) filter