![](/img/trans.png)
[英]How to use GHC Generics or Data.Data on a list of Data to merge fields on a certain criteria?
[英]How to use Data.Data?
由於我不熟悉 rank-N 類型,因此gfoldl
的類型簽名對我來說很麻煩:
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> a
-> c a
我能想到的唯一函數分別是\\xs y -> ($y) <$> xs
和pure
。
其他函數如gunfold
和gmapT
也有類似的問題。 那么它們的重要用途有哪些值得注意的例子呢?
對於gmapT
情況,原始論文中為此目的定義了mkT
函數。
mkT :: (Typeable a, Typeable b ) => (b -> b) -> a -> a
mkT f = fromMaybe id (cast f)
例如,要增加A
中的所有int
字段,您可以編寫類似
data A = A {f :: Int, s :: Int} deriving (Data, Typeable)
ex = gmapT (mkT inc) (A 2 3) where
inc :: Int -> Int
inc = (+1)
為了更清楚, ex
函數也可以這樣寫:
ex2 = gmapT f (A 2 3) where
f :: (Data a ) => a -> a
f a = case cast a of
Nothing -> a
(Just (b :: Int)) -> fromJust $ cast (b + 1)
Data.Data
是稱為“Scrap Data.Data
”的通用元編程框架的一部分。
Data.Data
模塊鏈接到關於該主題的研究出版物列表https://wiki.haskell.org/Research_papers/Generics#Scrap_your_boilerplate.21
syb 庫中充滿了通用轉換的示例,請特別參閱Schemes 模塊
曾經有一個 SYB wiki(從Data.Data
和 syb 鏈接),但遺憾的是它現在似乎已經死了。
對於不同類型的示例, boltzmann- Data.Data
(我是作者)將Data.Data
用於具有某些均勻性屬性的通用隨機生成器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.