我想用 Python 实现类似于这个 OCaml 的东西:
let example = fun v opt_n ->
let fltr = fun i -> i mod 2 = 0
let fltr = match opt_n with
| None -> fltr
| Some n -> fun i -> i mod n = 0 && fltr(n)
fltr v
这很容易组合/扩展,我可以在运行时添加任意数量的谓词。这当然是一个简化的示例,在现实生活中,我有许多可选的包含/排除集,以及用于成员资格的谓词检查。
在 Python 中以简单的方式执行此操作会失败:
def example(v: int, opt_n=None):
"""
doesn't work!
"""
# doesn't need to be a lambda, an explicitely defined function fails too
fltr = lambda i: i % 2 == 0
if opt_n is not None:
# fails miserably -> maximum recursion depth exceeded
fltr = lambda i: fltr(i) and i % opt_n == 0
return fltr(v)
example(10, 5)
这很烦人,因为似乎fltr
只能在作业的左侧出现一次,所以我必须fltr
在之后的每种情况下内联首字母:
def example(v: int, opt_n=None, opt_m=None):
"""annoying but works"""
fltr = None
# some inital filters
pred_0 = lambda _: True # do some real checks ...
pred_1 = lambda _: True # do some real checks ...
if opt_n is not None:
# fltr is inlined, only appears on left side, now it works
fltr = lambda i: pred_0(i) and pred_1(i) and opt_n % 2 == 0
if opt_m is not None:
# much repetition
fltr = lambda i: pred_0(i) and pred_1(i) and opt_n % 3 == 0
if fltr is None:
# inlined again
fltr = lambda i: pred_0(i) and pred_1(i)
return fltr(v)
有什么方法可以解决我的混乱,也许我遗漏了一些东西,以及/或者在 Python 中组合谓词的推荐方法是什么?