2012-05-03 80 views
11

我讀過關於Haskell記錄的一些問題,尤其是同一模塊中的兩個元素不能具有相同的名稱。Haskell記錄,更清潔的方法?

我明白你可以解決此通過具有獨立的模塊,但我並不想這樣做,而是嘗試這種方法:

class HasX a where 
    x :: a -> X 

data D1 = D1 { d1_x :: X, ... } 
instance HasX D1 where 
    x = d1_x 

data D2 = D2 { d2_x :: X, ... } 
instance HasX D2 where 
    x = d2_x 

(這不僅得到,沒有套,我當然需要編寫更多的代碼來做套)。

但是,似乎所有這些的類和實例聲明看起來像樣板文件,應該能夠使用模板haskell或其他東西來消除。

是否有一個GHC的庫或擴展,使這種方法寫得不那麼混亂?

+0

是的,哎呀。固定。 – Clinton

+1

這比這更復雜一點,因爲這兩個字段可能不具有相同的類型。 – augustss

+0

出於我的目的,假定具有相同名稱的字段具有相同的類型。我不會有具有不同類型的相同名稱的字段。 – Clinton

回答

5

看來Data.Has封裝了很多你正在尋找的東西。在他們的詞彙表中,我認爲他們的Knows型號更接近您的Has,並且它還提供注射的簽名。

他們還使用標籤機制來處理我認爲你還沒有考慮過的問題:包含具有相同類型字段的記錄。他們使用類型級標籤來消除歧義。

爲了方便起見,也似乎有一些支持,提供了Has實例與模板哈斯克爾的發電機Has-TH

您可以在奧列格的作品找到更多的類型級標籤和其他記錄相關材料類型魔術師,如OOHaskell(也與RalfLämmel一起)。

+0

你能指點我一些'Data.Has'的教程樣式文檔(和'Has-TH')。它看起來大致就像我在找的東西,但我不知道如何把它放在一起。 – Clinton

+0

其實,我找到了'Data.Has'這個:https://github.com/nonowarn/has/blob/master/examples/Announce04.lhs – Clinton

0

data-accessor-template可能至少有助於編寫set/get訪問器。也許有些人可以拿出模板Haskell代碼來生成每個記錄字段名稱的類和實例。 但是,我自己並沒有使用模板Haskell。它將您限制爲GHC,甚至限制到特定的GHC版本,因爲模板Haskell在不同GHC版本之間發生變化。每個模塊有一個(主要)記錄是真正的回報。