2013-06-21 4 views
4

Я изучаю Haskell, и мне интересно, как иметь предикат, который немного сложнее.Haskell более сложный предикат

Например, я могу это сделать:

any (>= 5) my_list 

Но я не могу найти способ, как сделать что-то вроде этого:

any (x `mod` 2 == 0) my_list 

Как я мог это сделать?

+4

Третья возможность, состав секций оператора, '' любой ((== 0). ('Mod' 2))' '. Конечно, этот конкретный пример должен быть «любым даже». –

ответ

5

Использование лямбда-функции:

any (\x -> x `mod` 2 == 0) my_list 
5

Для действительно сложной вещи, вы лучше, определяя отдельную функцию. Для небольших случаев вы можете использовать лямбда или даже что-то вроде

 

    any predicate myList 
      where predicate x = even x 
 

EDIT: даже x - это просто упрощение. Вы можете поместить что-то вроде where predicate x = (mod x 3) == 1

+0

Мой любимый для нетривиальных случаев. – Ingo

3

Как и с помощью анонимных (лямбда) функции, как в ответ @ m0nhawk, вы можете использовать функцию состав:

>>> any ((==0) . (`mod` 2)) [1,2,3] 
True