Я хочу, чтобы определить функцию, которая вычисляет количество элементов в списке, удовлетворяющих данный предикат:Количество элементов в Haskell в стиле pointfree
number_of_elements :: (a -> Bool) -> [a] -> Int
number_of_elements f xs = length (filter f xs)
Например:
number_of_elements (==2) [2,1,54,1,2]
должен возврат .
Мы можем написать его короче:
number_of_elements f = length . filter f
Можно ли писать без ф параметра?
Что ваше ищут называются «Pointfree стилем». Здесь есть wiki: http://www.haskell.org/haskellwiki/Pointfree. Он преподает вам все трюки, такие как сова: '((.) $ (.))' И точка: '((.). (.))'. Я бы лично не рекомендовал этот стиль. –
Я бы порекомендовал немного поиграть с ним, чтобы посмотреть, как он работает, но с использованием частично точечного стиля 'number_of_elements f = length. фильтр f'. Это наиболее читаемое правило. –
Это функция, которую я бы редко задавал, потому что 'length (filter f xs)', честно говоря, легче читать, чем 'number_of_elements f xs'. Последнее требует, чтобы я выяснил, что делает ваша функция, либо просматривая определение функции, документацию, либо вызывая ее из типа; в то время как первое представляет собой прямое совместное использование двух функций, которые я уже понимаю, - и это также короче, чтобы писать! Я бы только определил это как вспомогательную функцию в привязке 'where' или как функцию неэкспонированного модуля - и даже тогда, только если это будет аргумент для других функций. –