我正在用 Haskell 撰寫一個數值優化庫,目的是讓庫的用戶可以使用梯度下降演算法之類的函式。在撰寫這些相對復雜的函式時,我撰寫了中間函式,例如只執行一步梯度下降的函式。其中一些中間函式執行庫的用戶永遠不需要的任務。有些甚至非常神秘,但在被更大的函式使用時是有意義的。
將這些中介功能留給圖書館用戶使用是常見的做法嗎?我已經考慮將這些移動到“內部”庫,但是將小函式移動到與使用它們的主要函式完全不同的庫中對于代碼易讀性來說似乎是個壞主意。我也很想測驗這些較小的功能以及用于除錯目的的主要功能 - 理想情況下希望在同一個地方測驗兩者,這樣會使事情變得更加復雜。
毫不奇怪,我將 Cabal 用于庫,因此如果這更容易,那么在這種情況下的答案也會有所幫助。
uj5u.com熱心網友回復:
你絕對不應該在你的包的主干模塊的匯出中拋出這樣的內部函式,以及高級函式。它使界面/黑線鱈難以理解,并且如果用戶開始依賴可能在未來版本中容易更改的低級細節,也會帶來問題。
所以我會將這些函式保存在“內部”模塊中,“公共”模塊會匯入該模塊,但只會重新匯出那些打算使用的模塊:
上市
module Numeric.Hegash.Optimization (optimize) where import Numeric.Hegash.Optimization.Internal私人的
module Numeric.Hegash.Optimization.Internal where gradientDesc :: ... gradientDesc = ... optimize :: ... optimize = ... gradientDesc ...
一個更值得商榷的問題是您是否仍應允許用戶加載Internal模塊,即您是否應將其放在檔案的exposed-modulesorother-modules部分.cabal。IMO 最好在“暴露”方面犯錯,因為總有你沒有預見到的有效用例。它還使測驗更容易。只要確保您清楚地記錄該模塊是不穩定的。只有那些在實作細節中如此深入以至于它們在模塊之外基本上不可能使用的功能才根本不應該暴露出來。
uj5u.com熱心網友回復:
您可以通過在標題中列出它們來選擇性地從模塊中匯出函式。例如,如果你有函式gradient并且gradient1只想匯出前者,你可以寫:
module Gradient (gradient) where
您還可以將中間函式合并到它們的父函式中where,以將范圍限制為僅父函式。這也將防止內部函式被匯出:
gradient ... =
...
where
gradient1 ... = ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517165.html
上一篇:Haskell編程風格偏好
