2011-12-15 32 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