我有以下问题。
f[1]=1;
f[2]=2;
f[_]:=0;
dvs = DownValues[f];
这给
dvs =
{
HoldPattern[f[1]] :> 1,
HoldPattern[f[2]] :> 2,
HoldPattern[f[_]] :> 0
}
我的问题是我只想提取f [1]和f [2]等的定义,而不提取一般定义f [_],因此我不知道该怎么做。
我试过,
Cases[dvs, HoldPattern[ f[_Integer] :> _ ]] (*)
但它什么也没给我,即空的 list 。
有趣的是,将HoldPattern更改为临时^脚注
dvs1 = {temporary[1] :> 1, temporary[2] :> 2, temporary[_] :> 0}
并发行
Cases[dvs1, HoldPattern[temporary[_Integer] :> _]]
给
{temporary[1] :> 1, temporary[2] :> 2}
它的工作原理。这意味着(*)几乎是一个解决方案。
我不明白为什么它在临时模式下而不是在HoldPattern模式下工作?如何使它直接与HoldPattern一起使用?
当然,问题是要评估哪些内容而不是什么。等等。在Mathematica中进行编码时出现的以太坊问题。真正的大师的东西...
最诚挚的问候
佐兰
脚注=我手动键入它作为替换“/。HoldPattern->临时”实际上执行了f [_]:= 0规则并给出了一些奇怪的信息,我当然希望避免这种执行。
最佳答案
原因是您必须使用Verbatim逃避HoldPattern
:
In[11]:= Cases[dvs,
Verbatim[RuleDelayed][
Verbatim[HoldPattern][HoldPattern[f[_Integer]]], _]]
Out[11]= {HoldPattern[f[1]] :> 1, HoldPattern[f[2]] :> 2}
仅有少数几个是必需的,而
HoldPattern
是其中之一,正是因为它通常对模式匹配器“不可见”。对于您的temporary
或其他头来说,这不是必需的。请注意,将f[_Integer]
模式包装在HoldPattern
中-这次HoldPattern
直接用于其目的-保护该模式免于评估。请注意,RuleDelayed
也包装在Verbatim
中-这实际上是Verbatim
的另一种常见情况-这是必需的-因为Cases
具有涉及规则的语法,我们不希望Cases
在此使用此解释。因此,这是IMO一个很好的整体示例,可以说明HoldPattern
和Verbatim
。还请注意,可以使用
HoldPattern
完全实现目标,如下所示:In[14]:= Cases[dvs,HoldPattern[HoldPattern[HoldPattern][f[_Integer]]:>_]]
Out[14]= {HoldPattern[f[1]]:>1,HoldPattern[f[2]]:>2}
但是,从概念上讲,使用
HoldPattern
进行转义(代替Verbatim
)在IMO上是错误的。编辑
为了使用
Cases
稍微校正一下这种情况,这是一个简单的示例,其中我们使用了涉及转换规则的Cases
语法。这种扩展的语法指示Cases
不仅查找和收集匹配的片段,而且还在找到之后立即根据规则对它们进行转换,因此结果列表中包含转换后的片段。In[29]:= ClearAll[a, b, c, d, e, f];
Cases[{a, b, c, d, e, f}, s_Symbol :> s^2]
Out[30]= {a^2, b^2, c^2, d^2, e^2, f^2}
但是,如果我们需要找到本身就是规则的元素怎么办?如果我们只是尝试这样做:
In[33]:= Cases[{a:>b,c:>d,e:>f},s_Symbol:>_]
Out[33]= {}
它不起作用,因为
Cases
将第二个参数中的规则解释为使用扩展语法,查找符号并将其替换为_
的指令。由于默认情况下它是在1级上搜索的,而符号在此处是2级的,因此它什么也找不到。观察:In[34]:= Cases[{a:>b,c:>d,e:>f},s_Symbol:>_,{2}]
Out[34]= {_,_,_,_,_,_}
无论如何,这不是我们想要的。因此,我们必须强制
Cases
将第二个参数视为简单模式(简单而不是扩展语法)。有几种方法可以做到这一点,但所有方法都以某种方式“逃避”了RuleDelayed
(或Rule
):In[37]:= Cases[{a:>b,c:>d,e:>f},(s_Symbol:>_):>s]
Out[37]= {a,c,e}
In[38]:= Cases[{a:>b,c:>d,e:>f},Verbatim[RuleDelayed][s_Symbol,_]:>s]
Out[38]= {a,c,e}
In[39]:= Cases[{a:>b,c:>d,e:>f},(Rule|RuleDelayed)[s_Symbol,_]:>s]
Out[39]= {a,c,e}
在所有情况下,我们要么避免扩展
Cases
的语法(最后两个示例),要么设法利用它来发挥我们的优势(第一种情况)。