2015-05-20 7 views
0

Если у меня есть массив предикатных функций,Как сопоставить одно значение по массиву предикатов?

rules = [is_cute, has_good_job, is_not_crazy, is_tall_enough ] 

, что является лучшей практике применить их все на одной и той же переменной?

, что я пришел с это

candidate= "joe pesci" 
_.map(rules, function(rule){return rule.apply(candidate)}) 

явно цель состоит в том, чтобы использовать это в нечто вроде

it_is_true_love = _.all(rules.map(...)) 

это хорошая вещь, чтобы сделать? я что-то упускаю? Каковы другие способы сделать это в функциональном программировании?

+0

Пожалуйста, задайте язык на этикетках. –

+0

Я не использовал ни одного языка в частности. Я не думал, что это важно для вопроса. В настоящее время это псевдокод, вдохновленный js. Я могу изменить его на действительный js, но он теряет удобочитаемость. – deddu

ответ

0

Самое элегантное решение я нашел до сих пор с Rambda.js:

var rules = [is_cute, has_good_job, is_not_crazy, is_tall_enough ] 
var is_true_love = R.allPass(rules); 

пример использование:

// is_true_love('joe pesci') => false //not that cute anymore 
// is_true_love('elon musk') => false //he's probably crazy! 
// is_true_love(the_real_one) => true 
2

Если цель состоит в том, чтобы проверить, если каждый или некоторые из них истинно, то вы можете использовать:

rules.every(function(rule){return rule.apply(candidate)}) 
rules.some(function(rule){return rule.apply(candidate)}) 

Я не уверен, какой Алголь язык вы пишете в Похож JavaScript, поэтому я думаю, что вам нужно. используйте return в вашем примере, чтобы он работал.

1

Как и в случае с большинством проблем, вы можете использовать карту с лямбдой.

Пример написан на языке Elixir (обратите внимание, что точка здесь является применение функции):

bigger_than = fn x,y -> x>y end 
bigger_1 = fn x -> bigger_than.(x,1) end 
bigger_5 = fn x -> bigger_than.(x,5) end 
bigger_10 = fn x -> bigger_than.(x,10) end 

# list of predicates 
l = [bigger_1,bigger_5,bigger_10] 

# results in an interactive session: 
iex(7)> x=1 
iex(8)> Enum.map(l,fn f -> f.(x) end) 
[false, false, false] 
iex(9)> Enum.map(l,fn f -> f.(1) end) 
[false, false, false] 
iex(10)> Enum.map(l,fn f -> f.(3) end) 
[true, false, false] 
iex(11)> Enum.map(l,fn f -> f.(7) end) 
[true, true, false] 
iex(12)> Enum.map(l,fn f -> f.(11) end) 
[true, true, true] 
Смежные вопросы