[英]Best practice for handling data types from 3rd party libraries in Haskell?
我剛剛進入我的第一個真正的Haskell規模項目(一個Web應用程序),並且我開始遇到來自第三方庫的類型泄漏所有代碼的問題。 這是一個簡單的示例:
我的Parser
模塊導入Test.Parsec
,並導出一個返回Either ParseError DbConfig
的函數( parseConfig
),其中ParseError
是在Parsec
庫中定義的數據類型( DbConfig
是我的應用程序的自定義數據類型,為簡潔起見,未顯示)。
-- Parser.hs
module Parser where
import Text.Parsec
parseConfig :: String -> Either ParseError DbConfig
parseConfig = parse ...
以后,我想使用parseConfig
函數,但是要使用它,我必須再次導入Text.Parsec
,以便可以訪問ParseError
類型。
-- Api.hs
module Api where
import Parser
import Text.Parsec
getConfigFromBody :: Object -> Either ParseError DbConfig
getConfigFromBody = parseConfig . (...)
就進口管理而言,這不僅是麻煩,而且關注點分離也很差,因此,蝙蝠權我知道這不是最好的方法。 我的問題是,解決此問題的最佳實踐是什么? 使類型同義詞成為理想選擇嗎?
type ConfigParseError = ParseError
parseConfig :: String -> Either ConfigParseError DbConfig
parseConfig = parse ...
Parsec
保持在Parser
模塊內部的依賴關系而言,這似乎是合理的,但是默認情況下使用別名庫類型似乎是一種奇怪的模式。
所以我的問題是,更大的Haskell應用或庫如何處理呢? 是否存在管理第三方庫中數據類型的通用技術?
我還沒有准備好的最佳做法清單,但是對於初學者來說,如果您想保持事物的有條理,請使用顯式導出,而不是僅導出所有內容,例如:
module Parser
( parseConfig
) where
...
顯式導出還允許您重新導出導入,例如
module Parser
( parseConfig
, ParseError(..)
) where
...
之后,您可以import Parser
,並使ParseError
可用,就像在Parser
中定義的一樣。
我認為這應該可以解決您眼前的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.