带转换的映射列表返回不同的值

时间:2013-08-01 17:29:52

标签: wolfram-mathematica

在Mathematica中,我试图在一个更复杂的表达式中使用转换,同时将表达式映射到列表中。出于某种原因,使用转换规则会产生完全不同的值,但我无法从文档中找出原因。

Clear[x, values]

values = {{1}, {2, Null, 3}, {4, 5, Null, 6, Null }}
Out[122]= {{1}, {2, Null, 3}, {4, 5, Null, 6, Null}}

Length[x] /. x -> DeleteCases[#, Null] & /@ values
Out[123]= {0, 0, 0}

Length[DeleteCases[#, Null]] & /@ values
Out[124]= {1, 2, 3}

更新: 到目前为止,我已经能够确定Length[x]是一个有效的表达式,即使未定义x,因为Length[]的参数是一个表达式,返回该组件的数量表达。现在我需要了解如何延迟评估,直到替换x为止。

3 个答案:

答案 0 :(得分:1)

您可以定义自己的长度函数,仅评估列表(或其他)

length[v_List] := Length[v]
length[x] /. x -> DeleteCases[#, Null] & /@ values

(* 1 2 3 *)

或者更为一般......

length[v_ /; Head[v] =!= Symbol] := Length[v]

答案 1 :(得分:1)

我能够阻止使用Hold[]ReleaseHold[]对表达式进行早期评估。

In[229]:= ReleaseHold[Hold[Length[x]] /. x -> {1, 2, 3}]
Out[229]= 3

Length[x] /. x -> {1, 2, 3}
Out[230]= 0

在原始问题背景下,以下是我能够解决的问题:

ReleaseHold[Hold[Length[x]] /. x -> DeleteCases[#, Null]] & /@ values

答案 2 :(得分:1)

要在评估左侧之前进行替换,您可以使用Unevaluated

Unevaluated[Length[x]] /. x -> DeleteCases[#, Null] & /@ values
{1, 2, 3}

阅读Robby Villegas的Working with Unevaluated Expressions,详细了解这位负责人。


专用StackExchange站点:
enter image description here