在Mathematica中约束内置函数输出的最简单方法是什么?说让Sin只返回奇数?

Fre*_*ple 8 wolfram-mathematica

例如,对于Mathematica中的内置函数,f,最初f [1]给出{1,2,3},但我想让Mathematica只给出{1,3}.期望一种用于重写 f的简单方法.我不想定义新函数或完全重写f或仅处理原始f的输出.我想要改写f.

谢谢.:)

Ale*_*kov 11

你可以使用Villegas-Gayley技巧.

对于Sin功能:

Unprotect[Sin];
Sin[args___]/;!TrueQ[$insideSin]:=
   Block[{$insideSin=True,result},
      If[OddQ[result=Sin[args]],result]
   ];
Protect[Sin];
{Sin[Pi],Sin[Pi/2]}

==> {Null,1}
Run Code Online (Sandbox Code Playgroud)


小智 6

我更喜欢一个功能强大的方法,让我想起Python中的装饰器.http://wiki.python.org/moin/PythonDecorators

首先我们创建装饰器:

OddOnly[x_] := If[OddQ[x], x, Null];
Run Code Online (Sandbox Code Playgroud)

然后它可以用作前缀:

OddOnly@
 Sin[Pi]

Null (* Doesn't actually give a result *)

OddOnly@
 Sin[Pi/2]

1
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 6

我更喜欢Searke方法的一种变体:

OddOnly[s_Symbol] := 
 Composition[If[OddQ@#, #, ##&[]] &, s]
Run Code Online (Sandbox Code Playgroud)

这会自动删除非奇怪的结果,并将其应用于函数本身,我觉得更方便.

例子:

OddOnly[Sin] /@ {2, Pi, Pi/2}

(*  Out[]= {1}  *)

Array[OddOnly[Binomial], {5, 5}]

(*  Out[]= {{1}, {1}, {3, 3, 1}, {1}, {5, 5, 1}}  *)
Run Code Online (Sandbox Code Playgroud)

  • 好主意 - +1.既然我知道你对简洁的热情,那么我要指出,在"If"(或任何"Hold*`但不是"SequenceHold"的头部)中,相当于"Unevaluated @ Sequence []`的效果也可以用`序列@@ {}`. (5认同)
  • @Leonid,今天在我的笔记中,我发现了一个更短的形式:`##&[]`我希望我保持一半,因为我很聪明.;-) (2认同)