我想的功能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