2011-11-13 125 views
1

我想設計兩個模塊AB,它們都有自己的功能,例如:A.compare: A.t -> A.t -> bool,B.compare: B.t -> B.t -> boolAB的元素是可兌換的。所以我也需要功能a_of_b : B.t -> A.tb_of_a : A.t -> B.t。我的問題是我應該在哪裏定義這些功能?在AB或其他地方的結構裏面?Ocaml的設計2交互模塊

任何人都可以幫忙嗎?

EDIT1:只是修正基於第一評論

+0

我不確定這些模塊是否互動,它們可能是相互依賴或相關的。 –

回答

1

這是一個經典的設計問題。在OOP語言中,很難優雅地解決這個問題,因爲類封裝了類型定義和與該類型相關的方法。因此,只要你有一個函數,比如a_of_b,這兩個類型在同等程度上,就沒有明確的位置。

OCaml正確地爲這些不同的需求提供了不同的語言機制:類型定義與關鍵字type一起引入,並且相關方法一起收集在module中。這爲您在設計API時提供了更大的靈活性,但不能自動解決問題。

一種可能性是定義模塊A和B,都有它們各自的類型和比較功能。那麼,剩下的問題是在哪裏放a_of_bb_of_a。您可以任意選擇模塊A,並定義功能A.to_bA.of_b。這是標準庫在將to_list和​​放入Array時所做的。這缺乏對稱性;沒有理由不把這些功能放在B中。

相反,您可以使用of_函數與to_函數進行標準化。假設你更喜歡to_。然後你可以定義功能A.to_bB.to_a。現在的問題是模塊A和B是相互依賴的,這隻有在您將它們定義在同一個文件中時纔有可能。

如果您將有許多處理值爲A.tB.t的值的函數,那麼可能需要定義一個模塊AB,並將所有這些函數放在那裏。如果你只需要兩個,那麼額外的模塊可能是矯枉過正的。另一方面,如果關於A和B的函數總數很少,則只能創建模塊AB,其中包括type a,type b和所有相關方法。然而,這不符合OCaml社區在其自己的模塊中命名類型t的約定,並且將Set和Map仿函數應用於這些類型將更加困難。

+0

感謝您的意見......我仍然對如何定義一個包含A和B的模塊AB感興趣,在這種情況下,製作'AB.A_bto'和'AB.A.of_b'更好,或'AB.a_of_b'和'AB.b_of_a'? – SoftTimur

+0

如果你定義了'A.to_b'和'A.of_b',那麼我不明白你爲什麼需要模塊'AB'。它只包含模塊'A'和'B',我沒有看到爲模塊層次結構添加額外層的好處。你是否應該定義'A.to_b'和'A.of_b'與'AB.a_of_b'和'AB.b_of_a'是一個選擇問題。我提供了一些要考慮的標準。 –

+0

擁有一個包含子模塊A和B的模塊AB的一個原因是你想要有一個文件ab.ml&ab.mli(而不是a.ml,b.ml,a.mli,b.mli) 。 –

1

一些錯誤,你可能意味着A.compare: A.t -> A.t -> bool,因爲類型是在較低的情況下。

可以有一個單一的模塊AB其中同時包含A和類型B.

可以具有同時含有&乙作爲子模塊單個模塊AB類型。

您也可以使用recursive modules &仿函數。

+0

感謝您的評論...實際上,我希望能夠隨時調用A.compare或B.compare。因此,如果將它們定義在單個模塊「AB」中,我怎樣才能從外部調用它們? 'AB.A.compare'和'AB.B.compare'? – SoftTimur

+0

是的,'AB.A.compare'和'AB.B.compare' –

+0

和'AB.a_of_b'和'AB.b_of_a'?所以這是你提到的實現:第一個還是第二個? – SoftTimur