2011-12-15 47 views
6

这是一个分支和延伸:Is it safe to turn off Pattern::patv?处理灵活的参数在Mathematica函数

许多内置数学功能允许灵活的参数。在用户定义的函数中,我一直使用Alternatives来达到这个目的,但是对引用问题的评论和回答表明这至少是非标准的,也许是不可取的。

让我定义一个虚拟函数foo为例。

Off[Pattern::patv] 

p = {_?NumericQ, _?NumericQ}; 

foo[ 
    {x : p ..} | x : p, 
    {y__} | y__, 
    ops : OptionsPattern[] 
] /; Max[y] <= 10 := bar[#, y, ops] & /@ {x} 

foo接受,为了:

  • 一个对象匹配PATTEN p,或者这样的对象的列表。
  • 为10的最大值的一组隐式数字对象,无论是作为一个列表或参数的序列(如书面这些对象本身可以是具有为10的最大值的数值的列表)匹配OptionsPattern[]
  • 选项

如果未满足这些条件中的任何一个,则返回foo[args]未评估。

使用Alternatives|)的两种模式是最常见的情况,但它们不是排他性的。

我很想看看foo应该如何实现。

  • 完成此操作的标准方法是什么?

  • 它比使用Alternatives有什么优势?

  • 客观上是否更容易阅读?

回答

4

我相信,有对付灵活的参数三种典型方式:

  1. 任何事情都会发生:f[x_]
  2. 多种形式:f[{x : p ..}]f[x:p],其中一个叫其他,和
  3. 改变:f[{x : p ..} | x : p]

主要区别在于您处理灵活参数所增加的复杂性。每个都可以有其优点。

任何事情的主要优势在于创建可接受模式的简单性,但是这会将处理留给函数的内部,从而增加其复杂性。有关这方面的一个很好的例子,请参阅ErrorBarPlots.m文件。但是,最终,ErrorListPlot依赖于隐藏在第一种方法的外观后面的第二种方法。

在选择正确的替代方案时,多重表单方法将复杂性推向调度程序。它具有最简单的功能形式,因为一种形式通常会调用具有“正确”数据布局的另一种形式。这种方法的难点在于功能规格的指数增长与替代参数的数量。这可以通过采用混合方法来加以限制,如在ErrorListPlot中找到的方法。

交替有最复杂的模式形式,并可能需要特殊处理来提取类似于任何事情的替代方案。此外,模式本身可能更难以构建,并且由于可能需要额外处理,所以这种方法应该在三者中最少使用。但是,在某些情况下,就像在代码中一样,此方法可能是最直接的实现。

+0

感谢您的回答。请包括一些代码示例,具体说明如何实现“如果未满足这些条件中的任何一个,foo [args]将返回未评估。”与方法1和2(我知道列昂尼德的方法,但它是你使用?) – 2011-12-16 18:10:53