例如,我可能有
{1, 2, 3, 4, 5} // Select[#1, ((*** + 1 &) > 2) &] &
在这里,***
也希望成为#1,但不被认为是最外层的#1。有没有办法区分这两个?
感谢。
答案 0 :(得分:6)
我不确定我理解这个问题。您的预期输出是什么?... {2,3,4,5}?...如果是这样,插槽之间没有逻辑混淆:列表中Select
的第一个参数的每个元素都将被输入一个函数(第二个参数)。以下工作正常:
{1, 2, 3, 4, 5} // Select[#, ((# + 1) > 2) &] &
如果出现冲突,而不是插槽/符号表示法,您可以使用Function[{x,y,...},...]
表示法,例如
{1, 2, 3, 4, 5} // Select[#, Function[{x}, (x + 1) > 2]] &
答案 1 :(得分:3)
您的代码中有一个太多的&符号,请尝试
{1, 2, 3, 4, 5} // Select[#1, ((# + 1) > 2) &] &
这种方式#1
从列表中选取一个元素并将其传递给比较测试函数。因此,实际上#1
和#
会获得相同的元素。
将((# + 1&) > 2)&
作为比较函数没有任何意义,因为外部函数无法传递它的参数。你已经有效地编写了(F > 2)&
,即使F是一个纯函数,它的参数也没有插槽。对于你的工作方式,你必须写((# + 1&[#]) > 2)&
,这相当于(F[#] > 2)&
。