我想設計兩個模塊A
和B
,它們都有自己的功能,例如:A.compare: A.t -> A.t -> bool
,B.compare: B.t -> B.t -> bool
。 A
和B
的元素是可兌換的。所以我也需要功能a_of_b : B.t -> A.t
和b_of_a : A.t -> B.t
。我的問題是我應該在哪裏定義這些功能?在A
或B
或其他地方的結構裏面?Ocaml的設計2交互模塊
任何人都可以幫忙嗎?
EDIT1:只是修正基於第一評論
我想設計兩個模塊A
和B
,它們都有自己的功能,例如:A.compare: A.t -> A.t -> bool
,B.compare: B.t -> B.t -> bool
。 A
和B
的元素是可兌換的。所以我也需要功能a_of_b : B.t -> A.t
和b_of_a : A.t -> B.t
。我的問題是我應該在哪裏定義這些功能?在A
或B
或其他地方的結構裏面?Ocaml的設計2交互模塊
任何人都可以幫忙嗎?
EDIT1:只是修正基於第一評論
這是一個經典的設計問題。在OOP語言中,很難優雅地解決這個問題,因爲類封裝了類型定義和與該類型相關的方法。因此,只要你有一個函數,比如a_of_b,這兩個類型在同等程度上,就沒有明確的位置。
OCaml正確地爲這些不同的需求提供了不同的語言機制:類型定義與關鍵字type
一起引入,並且相關方法一起收集在module
中。這爲您在設計API時提供了更大的靈活性,但不能自動解決問題。
一種可能性是定義模塊A和B,都有它們各自的類型和比較功能。那麼,剩下的問題是在哪裏放a_of_b
和b_of_a
。您可以任意選擇模塊A,並定義功能A.to_b
和A.of_b
。這是標準庫在將to_list
和放入Array時所做的。這缺乏對稱性;沒有理由不把這些功能放在B中。
相反,您可以使用of_
函數與to_
函數進行標準化。假設你更喜歡to_
。然後你可以定義功能A.to_b
和B.to_a
。現在的問題是模塊A和B是相互依賴的,這隻有在您將它們定義在同一個文件中時纔有可能。
如果您將有許多處理值爲A.t
和B.t
的值的函數,那麼可能需要定義一個模塊AB,並將所有這些函數放在那裏。如果你只需要兩個,那麼額外的模塊可能是矯枉過正的。另一方面,如果關於A和B的函數總數很少,則只能創建模塊AB,其中包括type a
,type b
和所有相關方法。然而,這不符合OCaml社區在其自己的模塊中命名類型t
的約定,並且將Set和Map仿函數應用於這些類型將更加困難。
感謝您的意見......我仍然對如何定義一個包含A和B的模塊AB感興趣,在這種情況下,製作'AB.A_bto'和'AB.A.of_b'更好,或'AB.a_of_b'和'AB.b_of_a'? – SoftTimur
如果你定義了'A.to_b'和'A.of_b',那麼我不明白你爲什麼需要模塊'AB'。它只包含模塊'A'和'B',我沒有看到爲模塊層次結構添加額外層的好處。你是否應該定義'A.to_b'和'A.of_b'與'AB.a_of_b'和'AB.b_of_a'是一個選擇問題。我提供了一些要考慮的標準。 –
擁有一個包含子模塊A和B的模塊AB的一個原因是你想要有一個文件ab.ml&ab.mli(而不是a.ml,b.ml,a.mli,b.mli) 。 –
一些錯誤,你可能意味着A.compare: A.t -> A.t -> bool
,因爲類型是在較低的情況下。
可以有一個單一的模塊AB其中同時包含A和類型B.
可以具有同時含有&乙作爲子模塊單個模塊AB類型。
您也可以使用recursive modules &仿函數。
我不確定這些模塊是否互動,它們可能是相互依賴或相關的。 –