簡體   English   中英

在Haskell中處理來自第三方庫的數據類型的最佳實踐?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM