过滤元组集合
Filter an collection of tuples
我在 Julia 中玩迭代和理解,并尝试编写简单的问题:找到所有小于 10 的数字对,其乘积小于 10。这是我的第一次尝试:
solution = filter((a,b)->a*b<10, product(1:10, 1:10))
collect(solution)
但我收到错误 "wrong number of arguments"。这是意料之中的,因为 filter 中的匿名函数需要两个参数,但它得到一个元组。
我知道我可以做到
solution = filter(p->p[1]*p[2]<10, product(1:10, 1:10))
但它看起来不像上面那个好看。有没有一种方法可以告诉我 (a,b) 是元组类型的参数并使用类似于第一个示例中的语法的东西?
我不认为有一种方法可以完全按照您的意愿进行操作,但是对于匿名函数,您可以考虑以下一些替代方法:
x->let (a,b)=x; a*b<10 end
x->((a,b)=x; a*b<10)
如果你愿意,这些当然可以做成宏:
macro tup(ex)
@assert ex.head == :(->)
@assert ex.args[1].head == :tuple
arg = gensym()
quote
$arg -> ( $(ex.args[1]) = $arg; $(ex.args[2]) )
end
end
那@tup (a, b) -> a * b < 10
就随便你吧
Julia 中的 Metaprogramming 对于您一遍又一遍地做某事并且想要专门的语法的情况非常有用和常见。但如果这是一次性的事情,我会避免这种元编程,因为添加新语法意味着学习新语法并使代码更难阅读。
我在 Julia 中玩迭代和理解,并尝试编写简单的问题:找到所有小于 10 的数字对,其乘积小于 10。这是我的第一次尝试:
solution = filter((a,b)->a*b<10, product(1:10, 1:10))
collect(solution)
但我收到错误 "wrong number of arguments"。这是意料之中的,因为 filter 中的匿名函数需要两个参数,但它得到一个元组。 我知道我可以做到
solution = filter(p->p[1]*p[2]<10, product(1:10, 1:10))
但它看起来不像上面那个好看。有没有一种方法可以告诉我 (a,b) 是元组类型的参数并使用类似于第一个示例中的语法的东西?
我不认为有一种方法可以完全按照您的意愿进行操作,但是对于匿名函数,您可以考虑以下一些替代方法:
x->let (a,b)=x; a*b<10 end
x->((a,b)=x; a*b<10)
如果你愿意,这些当然可以做成宏:
macro tup(ex)
@assert ex.head == :(->)
@assert ex.args[1].head == :tuple
arg = gensym()
quote
$arg -> ( $(ex.args[1]) = $arg; $(ex.args[2]) )
end
end
那@tup (a, b) -> a * b < 10
就随便你吧
Metaprogramming 对于您一遍又一遍地做某事并且想要专门的语法的情况非常有用和常见。但如果这是一次性的事情,我会避免这种元编程,因为添加新语法意味着学习新语法并使代码更难阅读。