这是: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
按顺序接受:
p
的对象,或此类对象的列表。OptionsPattern[]
如果不满足任何这些条件,则foo[args]
将被评估为未评估。
使用Alternatives
(|
)的两种模式是最常见的情况,但它们并不是唯一的。
我很难知道如何最好地实施foo
。
实现这一目标的规范方法是什么?
与使用Alternatives
相比,它有什么优势?
客观上更容易阅读吗?
答案 0 :(得分:4)
我认为有三种规范的方法来处理灵活的论点:
f[x_]
,f[{x : p ..}]
和f[x:p]
,其中一种调用另一种形式,f[{x : p ..} | x : p]
。主要区别在于您处理灵活参数的额外复杂性。每个人都可以发挥其优势。
任何事情的主要优点是创建可接受模式的简单性,但这会将处理留给函数的内部,从而增加其复杂性。有关此问题的详细示例,请参阅ErrorBarPlots .m
文件。但最终,ErrorListPlot
依赖于隐藏在第一种方法的外观背后的第二种方法。
多形式方法在选择正确的替代方案时将复杂性推到调度程序上。它具有最简单的函数形式,因为一种形式通常使用“正确”的数据布局调用另一种形式。这种方法的难点在于功能规范的指数增长以及具有替代方案的参数数量。这可以通过采用混合方法来限制,如ErrorListPlot
中所示。
交替具有最复杂的模式形式,并且可能需要特殊处理来提取类似于任何事物的替代方案。此外,模式本身可能更难以构建,并且由于可能进行额外处理,因此应该最少使用这三种方法。但是,在某些情况下,就像在代码中一样,此方法可以是最直接的实现。