我应该如何编写一个在 Mathematica 中的 Apply 中使用的函数?

发布于 2024-10-15 05:43:37 字数 211 浏览 1 评论 0原文

我想知道如何编写一个在 Mathematica 的 Apply 函数中使用的函数?例如,我想简单地重新实现 Or 函数,我发现以下代码

Apply[(#1 || #2)&,{a,b,c}]

不行,因为它只对列表中的前两个元素进行了 Or 操作。非常感谢!

I am wondering how I can write a function to be used in the Apply function in Mathematica? For example, I want to trivially re-implement the Or function, I found the following

Apply[(#1 || #2)&,{a,b,c}]

is not okay since it only Or'ed the first two elements in the list. Many thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

好听的两个字的网名 2024-10-22 05:43:37

无论有多少个变量,这都会起作用,并且是一种通用模式:

Or[##]&,

例如

In[5]:= Or[##] & @@ {a, b, c}

Out[5]= a || b || c

,但是,在 Or 的情况下,这还不够好,因为 Or 是 < code>HoldAll 和短路 - 也就是说,它在第一个 True 语句处停止,并保持其余部分不被计算。示例:

In[6]:= Or[True, Print["*"]]

Out[6]= True

In[7]:= Or[##] & @@ Hold[True, Print["*"]]

During evaluation of In[7]:= *

Out[7]= True

但这没问题:

Function[Null,Or[##],HoldAll],

例如,

In[8]:= Function[Null, Or[##], HoldAll] @@ Hold[True, Print["*"]]

Out[8]= True

可以在这种情况下使用(当您不希望对参数进行求值时)。请注意,这使用了未记录的函数形式。 R.Maeder 的《Programming in Mathematica》一书中提到了这种形式。

华泰

This will work, no matter how many vars, and is a general pattern:

Or[##]&,

for example

In[5]:= Or[##] & @@ {a, b, c}

Out[5]= a || b || c

However, in the case of Or, this is not good enough, since Or is HoldAll and short-circuiting - that is, it stops upon first True statement, and keeps the rest unevaluated. Example:

In[6]:= Or[True, Print["*"]]

Out[6]= True

In[7]:= Or[##] & @@ Hold[True, Print["*"]]

During evaluation of In[7]:= *

Out[7]= True

This will be ok though:

Function[Null,Or[##],HoldAll],

for example,

In[8]:= Function[Null, Or[##], HoldAll] @@ Hold[True, Print["*"]]

Out[8]= True

and can be used in such cases (when you don't want your arguments to evaluate). Note that this uses an undocumented form of Function. The mention of this form can be found in the book of R.Maeder, "Programming in Mathematica".

HTH

病女 2024-10-22 05:43:37
Or @@ {a, b, c}     

等效

Apply[Or, {a, b, c}]  

等效

{a, b, c} /. {x_, y__} -> Or[x, y]  

应用的工作原理如下:

{2 #1, 3 #2, 4 #3} & @@ {a, b, c}  
{2 a, 3 b, 4 c}

Plus[2 #1, 3 #2, 4 #3] & @@ {a, b, c}
2 a + 3 b + 4 c
Or @@ {a, b, c}     

Equivalent

Apply[Or, {a, b, c}]  

Equivalent

{a, b, c} /. {x_, y__} -> Or[x, y]  

Apply works like this:

{2 #1, 3 #2, 4 #3} & @@ {a, b, c}  
{2 a, 3 b, 4 c}

Plus[2 #1, 3 #2, 4 #3] & @@ {a, b, c}
2 a + 3 b + 4 c
栖迟 2024-10-22 05:43:37

您确定您对Apply 的期望是正确的吗?如果您查看文档,http://reference.wolfram.com/mathematica/ref/ Apply.html,你会看到Apply[f,expr]只是用expr替换了f的头部。一般来说,它给出f[expr]。

如果您希望使用函数 f 对 expr 进行操作,请尝试 f@expr 或 f[expr]。

也许您理解上述内容,而您的问题实际上是,“我如何定义一些 f,当我执行 Apply[f,{a,b,c}] 时,它与 执行相同的工作>或者[a,b,c] 是吗?

Are you sure you are expecting the right thing from Apply? If you look in the documentation, http://reference.wolfram.com/mathematica/ref/Apply.html, you will see that Apply[f,expr] simply replaces the head of f by expr. It does not, in general, give f[expr].

If you wish to operate with function f onto expr, try f@expr or f[expr].

Perhaps you understand the above and your question really is, "how do I define some f that, when I do Apply[f,{a,b,c}], does the same job as Or[a,b,c]. Is that it?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文