2015-12-13 280 views
1

將非常見類型類的實例聲明放在額外模塊中是不錯的樣式嗎?額外模塊中罕見類型類的實例聲明

作爲一個例子,我有這個簡單的樹類型:

module Data.Tree where 

data Tree a = Leaf a 
      | Node (Tree a) (Tree a) 

假設我想用快速檢查的Arbitrary類型類生成Tree類型的隨機值(和能夠不僅在測試中使用它們)。

什麼是最好的?把它們放在同一個模塊在Tree定義

module Data.Tree where 

import QuickCheck.Arbitrary 

data Tree a = ... 

instance Arbitrary a => Arbitrary (Tree a) where 
    ... 

或外包實例聲明另一個模塊,以避免Data.Tree

module Data.Tree.Arbitrary where 

import Data.Tree 
import QuickCheck.Arbitrary 

instance Arbitrary a => Arbitrary (Tree a) where 
    ... 

或別的東西完全依賴於QuickCheck.Arbitrary

回答

3

它通常是避免孤兒情況下是一個好主意:這些都是驚喜總是好的,而很難找到。

所以,是的,把實例,其中Tree定義的模塊中。這會讓模塊吹起來一點,但它不應該是一個問題。如果你有一個較大的模塊或兩個較小的模塊,那麼整個封裝的總構建時間應該不會太大。

當你能完全避免包的依賴,這可能使孤兒情況下是值得的,因爲安裝包是明顯高於從安裝包導入模塊更大的性能問題。

+0

避免軟件包的依賴關係不只是一個性能問題,它是關於避免與可能有不同的版本庫的依賴其它軟件包之間的衝突。 –

+0

@AlexeyRomanov:當然,但是在依賴衝突的情況下,孤立實例模塊可能也無濟於事。 – leftaroundabout

+0

@leftaroundabout如果該模塊沒有暴露 - 例如如果它只在測試套件的內部使用,這看起來可能考慮到在問題中對快速檢查的明確討論。 –