2012-01-02 28 views
2

定義的測量功能,操作員,我想定義一個操作l_op : A list * A list -> A list,其實施需要另算op : A * A -> A。鑑於a0: A,雖然所有a1 : Aop a0 a1總是返回結果爲A,對於一些a1結果使得更有意義比其他a1OCaml中

直觀l_op al0 al1需要的策略匹配,其中發現的一個al1有意義元件,關於op,對於al0每個元素。然後op的結果列表是l_op的結果。

所以我需要的意思措施。

一種可能的選擇是,一個功能measure: A * A * A -> int可以定義。例如,measure a0 a1 (op a0 a1)給出從1到10的整數,它表示op a0 a1是如何有意義的。然後在l_op al0 al1的實施,爲al0每個a0,我能找到a1這樣measure a0 a1 (op a0 a1) >= measure a0 a1' (op a0 a1') for all a1' in al1。然後,我刪除了兩個列表a0a1,並匹配兩個列表的其餘部分...

另一種選擇是,我改變一點點opop : A * A -> A * int其中整數代表當前操作如何有意義。然後在執行l_op al0 al1,對於a0的每個al0,我可以找到a1這樣的for all a1' in al1, m1 >= m1' where (_, m1), (_, m1') = op a0 a1, op a0 a1'

第二選擇的一個優點是,我們可以節省一些代碼,因爲我們可以計算測量,而這樣做op a0 a1。缺點是我發現簽名op : A * A -> A * intop : A * A -> A好看。

所以我的問題是:

1)沒有爲這種測量功能(它首先h可能)的常規詞,但我已經忘記了,會有人提醒?

2)你認爲int是一個很好的類型測量?也許我們可以爲此定義一種類型......最傳統的方式是什麼?

3)我上面提到哪個選擇更好?或者有沒有人有更好的主意?

回答

2

沒有爲這種測量功能(它首先可能是H)的傳統的話,

也許「啓發式」?它來自古希臘語,用於「發現,發現」,並用於計算機科學,用來命名尋找「足夠好」結果的方法,通常以更簡單但幾乎同樣有效的方式逼近完美行爲。這裏真的很合適(除非你的「意義測量」實際上是一種啓發式/近似),但是以'h'開始。

我會建議只是把你的測量稱爲「分數」或「重量」。

您認爲int是一種很好的測量類型嗎?也許我們可以爲此定義一種類型......最傳統的方式是什麼?

取決於您的測量是如何定義的。結果需要多少結構(例如,您可能想要保持測量的正確性,需要更豐富的結構)?您在測量時使用什麼樣的操作?如果你只使用加法和常量,int是好的,如果你使用除法等,可能需要float。在所有情況下,您可能都需要一個可以比較的類型。

我想大多數情況下int都可以,否則你就可以相對容易地改變主意。如果您打算改變這一點,你可以用一個類型別名:

type measure = int 

這樣,您就可以使用measure代替int在大部分代碼,並且不需要事後全部替換。也就是說,在OCaml中,我們通常不會寫出很多類型註釋,這要歸功於推理,所以在實踐中,我不希望將您的輸入選擇的細節傳播到很多代碼中。

上面我提到哪個選擇更好?或者有沒有人有更好的主意?

我會選擇第二種選擇。我懷疑在「計算結果」的A -> A -> A操作和「計算結果含義」的A -> A -> int操作之間存在一些冗餘。通過同時執行這兩個操作(A -> A -> A * int),您可以重複使用相同的邏輯結構,從而使通信更加清晰(並且使用更少的代碼)。相反,如果兩種操作完全無關,您可以考慮有兩個獨立的操作員(但我仍然使用A -> A -> int進行評分;如果您需要獲得結果來衡量含義,您仍然可以在內部調用第一個操作)。