Haskell - язык высокого уровня.Вместо того, чтобы предоставлять одну функцию для каждой возможной комбинации обстоятельств, с которыми вы можете столкнуться, она предоставляет вам небольшой набор функций, которые охватывают все основы, и затем вы склеиваете их по мере необходимости для решения любой проблемы, которая в данный момент существует.1001 *
С точки зрения простоты и краткости, это настолько элегантно, насколько это возможно.Так что да, length . filter pred
- это абсолютно стандартное решение.В качестве другого примера рассмотрим elem
, который (как вы, возможно, знаете) сообщает вам, присутствует ли данный элемент в списке.Стандартная эталонная реализация для этого на самом деле
elem :: Eq x => x -> [x] -> Bool
elem x = foldr (||) False . map (x ==)
В словах порядка, сравните каждый элемент в списке с целевым элементом, создав новый список Bools.Затем сложите функцию логического ИЛИ в этом новом списке.
Если это кажется неэффективным, постарайтесь не беспокоиться об этом.В частности,
Компилятор часто может оптимизировать временные структуры данных, созданные с помощью такого кода, как этот.(Помните, это стандартный способ для написания кода на Haskell, поэтому компилятор настроен на его обработку.)
Даже если это невозможноОптимизированный, лень часто делает такой код достаточно эффективным в любом случае.
(В этом конкретном примере функция OR завершит цикл, как только будет найдено совпадение - как и в случаеесли вы сами его кодировали.)
Как правило, пишите код, склеивая вместе существующие функции.Измените это, только если производительность недостаточно хороша.