功能FunctionQ
將如何看起來,也許我甚至可以指定允許的參數數量?測試表達式是否爲函數?
回答
西蒙和丹尼爾之後,我真的覺得不舒服,但是他們的代碼在非函數上失敗,而這些函數不是符號。檢查這一點,通過NumericFunction
增加了內建的支票,由西蒙的建議,我們得出類似
FunctionQ[_Function | _InterpolatingFunction | _CompiledFunction] = True;
FunctionQ[f_Symbol] := Or[
DownValues[f] =!= {},
MemberQ[ Attributes[f], NumericFunction ]]
FunctionQ[_] = False;
應在一些(嘆氣)真實世界的情況下工作
In[17]:=
FunctionQ/@{Sin,Function[x,3x], Compile[x,3 x],Interpolation[Range[5]],FunctionQ,3x,"a string", 5}
Out[17]= {True,True,True,True,True,False,False,False}
如果您知道你正在尋找的函數的簽名(即多少個參數和什麼類型),我會同意西蒙的說法,那就是鴨子打字:Apply
這個函數用於典型的參數,並尋找有效的輸出。緩存可能是值得的:
AlternativeFunctionQ[f_]:=AlternativeFunctionQ[f]=
With[{TypicalArgs={1.0}},NumericQ[Apply[f,TypicalArgs]]];
In[33]= AlternativeFunctionQ/@{Sin,Function[x,3x], Compile[x, 3x],Interpolation[Range[5]],FunctionQ,3x,"a string", 5}
Out[34]= {True,True,True,True,False,False,False,False}
絕對不會感覺不好!這就是SO的MO:相互建立,以提出最佳答案。對此,偉大的工作,順便說一句! – dreeves 2010-09-23 12:43:06
我只是再看一遍,我注意到'FunctionQ'沒有被'AlternativeFunctionQ'發現爲1 var函數。因此,儘管它在找到數字函數方面很有效,但它找不到其他類型。 – rcollyer 2010-11-05 19:54:04
@rcollyer:'AlternativeFunctionQ'就是一個例子:典型的參數以及有效的輸出應該適應當前的情況。我想這從架構的角度來看並不是很優雅,但它通常很適合這項法案。 – Janus 2010-11-08 02:04:07
這裏的東西快速和骯髒的可以做你的需要:
FunctionQ[x_] := Head[x] == Function || DownValues[x] =!= {}
謝謝!我試着在星期一接受你的答案,然後...... – 2010-09-17 20:19:23
正如丹尼爾說,他的測試(這可能應該讀)
FunctionQ[x_] := Head[x] === Function || DownValues[x] =!= {}
是快速和骯髒。內置函數會失敗,例如FunctionQ[Sin]
將返回False(通過檢查Attribute
NumericFunction
將捕獲許多內置函數)。它也將失敗,如f[x_][y_]
等......它也許應該測試UpValues
,SubValues
和NValues
(參見here的含義)。
此問題在此thread中討論過。在這個主題中有許多有用的想法 - 例如找出一些函數可以採用的論證數量的方法,但是在討論中沒有達成真正的共識。
我認爲最好的方法是一種duck typing。你可能知道你想要你的函數有多少種類型的參數,所以用ValueQ進行測試。然後確保您使用Check發現錯誤。
編輯: 另一個comp.soft-sys.math.mathematica thread。
- 1. 測試值是否爲函數
- 2. 測試字符串是否爲空的正則表達式
- 3. JavaScript的正則表達式 - 測試不是函數
- 4. elisp函數檢查測試字符串是否與正則表達式匹配?
- 5. 測試數字是否升序 - 正則表達式
- 6. 是否可以測試正則表達式以查看它是否減少爲:*
- 7. 測試函數是否與已知函數的行爲相同
- 8. lambda表達式是否可以作爲函數指針傳遞?
- 9. gcc是否考慮將非常量表達式函數的內置函數作爲常量表達式
- 10. PHP正則表達式:測試是否匹配,然後刪除
- 11. 水豚測試頁面是否有正則表達式
- 12. 正則表達式測試
- 13. Linux測試表達式
- 14. 單元測試(Python),測試函數是否返回數組
- 15. 函數測試變量是否存在
- 16. 檢測正則表達式是否呈指數形式
- 17. xslt測試中的IN函數布爾表達式
- 18. 如何在茉莉花中測試函數表達式
- 19. sympy:測試的子表達式的三角函數
- 20. Python:測試參數是否爲整數
- 21. 測試整數是否爲素數
- 22. 用於檢測輸入是否爲格式化數字的正則表達式
- 23. 如何測試函數是否被調用(單元測試角)
- 24. 爲什麼這個測試表達式是一個錯誤?
- 25. 正則表達式來測試一個字符串是否以數字結尾
- 26. 檢測Clojure表達式是否爲原始的
- 27. 向測試夾具添加成員函數是否表示測試不良?
- 28. Lambda表達式作爲函數參數
- 29. 空表達式是否評估爲NOP?
- 30. 檢查Sympy表達式是否爲Nan?
我不太明白你的問題。你的意思是你想寫一個FunctionQ [input_]函數,如果輸入是一個函數,返回True,否則返回false?輸入採取什麼形式? – 2010-09-17 16:20:25
@Mark:我會回答是的第一個問題。輸入的形式是一個Mathematica表達式... – 2010-09-17 20:18:47