我想的功能AnyTrue[expr,{i,{i1,i2,...}}]
其中检查是否expr
是True
任何的i1,i2...
它应该是仿佛AnyTrue
其次[email protected]@%
Table
,不同之处在于它只有评估expr
,直到找到第一个True
。自定义函数(行为类似于表)
短路部分是可选的,我真的很想知道的是正确的方法来模拟Table
的非标准评估序列。
更新11/14
这里有一个解决方案,由于迈克尔,你可以用它来链“所有”和“存在”检查
SetAttributes[AllTrue, HoldAll];
SetAttributes[AnyTrue, HoldAll];
AllTrue[{var_Symbol, lis_List}, expr_] :=
LengthWhile[lis,
TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]] &] ==
Length[lis];
AnyTrue[{var_Symbol, lis_List}, expr_] :=
LengthWhile[lis,
Not[TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]]] &] <
Length[lis];
AllTrue[{a, {1, 3, 5}}, AnyTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
AnyTrue[{a, {1, 3, 5}}, AllTrue[{b, {2, 4, 5}}, EvenQ[a + b]]]
烨,工程perfe ct – 2010-11-15 07:31:31
迟到了,我只想指出参数模式中的过多细节通常不适合Hold特性。例如,以下调用失败:AnyTrue [i <10,{i,Range [5]}],原则上它不应该(模式不匹配,因为在模式匹配时它不知道Range [ 5]是List)。这个稍微更一般的签名将会消除这个问题:AnyTrue [expr_,{var_Symbol,lis_}]。此外,AnyTrue不能在M8的打包列表中工作 - 长度似乎存在一个错误:LengthWhile [Range [5],! TrueQ [#<10]&]给出5,我要报告它。 – 2011-01-13 02:15:37
是的,好点的狮子座。在评估它之后,有一个更一般的模式并验证论点会更好。 'HoldAll'而不是'HoldFirst'是必要的,因为我们希望除'expr'之外还保留'var',否则就不会有更挑剔的模式出现问题。 – 2011-01-13 02:22:51