映射(/ @)行为

时间:2011-02-04 18:04:03

标签: wolfram-mathematica

我猜这个很容易,我忽略了是一个明显的文盲迹象,但无论如何。

怎么样?

(Map[Sign, LessEqual[x, y]]) === LessEqual[Sign[x], Sign[y]]
-> True  

但是

(Map[Sign, LessEqual[-1, -100]]) == LessEqual[Sign[-1], Sign[-100]]
-> False  

2 个答案:

答案 0 :(得分:7)

在lhs上使用Trace将有助于显示已发生的事情。

Trace[Map[Sign, LessEqual[-1, -100]]]

Out [2] = {{-1< = -100,False},Sign / @ False,False}

请注意,Map没有HoldXXX属性。

Attributes[Map]

Out [3] = {Protected}

因此,在Map执行任何操作之前,LessEqual会进行评估。那时你得到了

Map[Sign,False]

由于False是一个原子表达式,因此只评估为False。

当然,rhs的计算结果为True,因为Sign [-1]和Sign [-100]都是-1。

Daniel Lichtblau Wolfram Research

答案 1 :(得分:3)

看看当你分两步完成时会发生什么:

In[1]:= LessEqual[-1,-100]
Out[1]= False

In[2]:= Map[Sign, False]
Out[2]= False

第二个结果可能会令人惊讶,但恰好是Map函数的工作原理;如果对长度为0的表达式使用Map(如符号False),则只返回该表达式不变。另一个例子:

In[3]:= Map[f, "Pillsy"]
Out[3]= "Pillsy"

另一方面,显然

In[4]:= LessEqual[Sign[-1],Sign[-100]]
Out[4]= True