如何将单个值映射到谓词数组?

how to map a single value over an array of predicates?

如果我有一个谓词函数数组,

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(...))

这是一件好事吗?我错过了什么吗?在函数式编程中还有哪些其他方法可以做到这一点?

如果目的是检查每个或某些是否为真,那么您可以使用:

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

我不确定你用的是哪种 Algol 语言。看起来像 JavaScript 所以我想你需要在你的示例中使用 return 才能工作。

与大多数 "for-like" 问题一样,您可以将 map 与 lambda 一起使用。

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]

到目前为止我找到的最优雅的解决方案是 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