【问题标题】:how to distinguish slot in multiple levels of pure functions in mathematica如何区分mathematica中多级纯函数中的槽
【发布时间】:2011-01-27 06:33:27
【问题描述】:

例如,我可能有

{1, 2, 3, 4, 5} // Select[#1, ((*** + 1 &) > 2) &] &

这里,*** 也想成为 #1,但不被识别为最外层的 #1。有什么方法可以区分这两者吗?

谢谢。

【问题讨论】:

  • 如果你发布你想要的结果,这个问题会更容易理解
  • 那里有两个很好的答案。 @Leo 回答了嵌套匿名函数通常会出现什么问题。 @Timo 意识到李强的那段代码出了什么问题。
  • 您发布的代码 sn-p 是否等同于{1, 2, 3, 4, 5} // Select[#1, # > 1 &] &

标签: wolfram-mathematica


【解决方案1】:

我不确定我是否理解这个问题。您的预期输出是什么?.. {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]] &

【讨论】:

  • 我还应该补充一点,使用 Function[] 表示法通常可以帮助您整理匿名函数,以防您感到困惑。例如,您原来的 ((# + 1&) > 2)&(正如 Timo 指出的那样,没有意义)将等同于 Function[{x}, Function[{y}, (y + 1)] > 2]];使用这种表示法,错误(希望)更容易发现。
【解决方案2】:

你的代码中的 & 符号太多了,试试

{1, 2, 3, 4, 5} // Select[#1, ((# + 1) > 2) &] &

这样#1 从列表中挑选一个元素并将其传递给比较测试函数。所以实际上#1# 确实得到了相同的元素。

((# + 1&) > 2)& 作为比较函数没有实际意义,因为外部函数无法传递它的参数。您已经有效地编写了(F > 2)&,尽管 F 是一个纯函数,但它的参数没有插槽。对于你的工作方式,你必须写((# + 1&[#]) > 2)&,相当于(F[#] > 2)&

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多