簡體   English   中英

Clojure - 測試函數表達式的相等性?

[英]Clojure - test for equality of function expression?

假設我有以下clojure函數:

(defn a [x] (* x x))

(def b (fn [x] (* x x)))

(def c (eval (read-string "(defn d [x] (* x x))")))

有沒有辦法測試函數表達式的相等性 - 有些相當於

(eqls a b)

返回true?

它完全取決於“函數表達式的相等性”的含義。

這些函數最終將作為字節碼,因此我可以將每個函數對應的字節碼轉儲到byte [],然后比較兩個字節碼數組。

但是,有許多不同的編寫語義等效方法的方法,這些方法在字節碼中的表示方式不同。

一般來說,如果不運行它就無法分辨出一段代碼。 因此,在所有可能的輸入上,無法在不運行兩個代碼的情況下判斷兩位代碼是否相等。

從計算上講,這至少與暫停問題一樣糟糕,甚至可能更糟。

暫停問題是不可判定的,因此這里的一般情況答案絕對沒有(並且不僅僅適用於Clojure,而是適用於所有編程語言)。

我同意上述答案,關於Clojure沒有內置的能力來確定兩個函數的等價性,並且已經證明你不能在功能上測試程序(也稱為黑盒測試)來確定由於停止問題(除非輸入集是有限的並且已定義)。

我想指出,即使它們具有不同的形式(不同的字節代碼),也可以用代數方式確定兩個函數的等價性。

代數證明等價的方法是在1930年由Alonzo Church開發的,並且在Lambda微積分中被稱為β減少。 這個方法當然適用於你的問題中的簡單形式(也會產生相同的字節代碼),也適用於產生不同字節代碼的更復雜的形式。

我不能添加其他人的優秀答案,但想提供另一個幫助我的觀點。 如果您正在測試從您自己的函數返回正確的函數,而不是比較函數對象,您只需將函數作為'symbol返回即可。

我知道這可能不是作者所要求的,但對於簡單的情況,它可能會這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM