代码之家  ›  专栏  ›  技术社区  ›  Yaroslav Bulatov

具有非标准计算的自定义函数(行为类似于表)

  •  3
  • Yaroslav Bulatov  · 技术社区  · 14 年前

    我想要一个函数 AnyTrue[expr,{i,{i1,i2,...}}] 检查是否 expr True 对于任何 i1,i2... 就好像 AnyTrue Table 然后 Or@@% ,区别是它只计算 出口 直到第一次 真的 找到了。

    短路部分是可选的,我想知道的是正确的模拟方法 桌子 的非标准评估序列。

    更新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]]]
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   Michael Pilat    14 年前

    这个怎么样?

    SetAttributes[AnyTrue, HoldAll];
    
    AnyTrue[expr_, {var_Symbol, lis_List}] :=
      LengthWhile[lis, 
        Not[TrueQ[ReleaseHold[Hold[expr] /. HoldPattern[var] -> #]]] &
      ] < Length[lis]
    

    包括短路通过 LengthWhile 把所有东西都放在必要的地方,以便一切按预期进行 var 具有函数之外的值:

    In[161]:= x = 777;
    
    In[162]:= AnyTrue[Print["x=", x]; x == 3, {x, {1, 2, 3, 4, 5}}]
    During evaluation of In[162]:= x=1
    During evaluation of In[162]:= x=2    
    During evaluation of In[162]:= x=3
    Out[162]= True
    

    内置的 Or 也是短路,为了它的价值。(但我意识到,用例如。 Table 是一种痛苦):

    In[173]:= Or[Print[1];True, Print[2];False]
    During evaluation of In[173]:= 1
    Out[173]= True
    
        2
  •  4
  •   dreeves    14 年前

    这与您的规范不匹配,但我经常使用以下实用程序函数,这些函数与您的想法类似(它们使用纯函数而不是带有指定变量的表达式),并且也会短路:

    some[f_, l_List] := True ===                (* Whether f applied to some      *)
      Scan[If[f[#], Return[True]]&, l];         (*  element of list is True.      *)
    
    every[f_, l_List] := Null ===               (* Similarly, And @@ f/@l         *)
      Scan[If[!f[#], Return[False]]&, l];       (*  (but with lazy evaluation).   *)
    

    例如,Michael Pilat的例子如下:

    In[1]:= some[(Print["x=", #]; # == 3)&, {1, 2, 3, 4, 5}]
    
       During evaluation of In[1]:= x=1
       During evaluation of In[1]:= x=2    
       During evaluation of In[1]:= x=3
    Out[1]= True