簡體   English   中英

如何使用Data.Data?

[英]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) <$> xspure

其他函數如gunfoldgmapT也有類似的問題。 那么它們的重要用途有哪些值得注意的例子呢?

對於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 ”的通用元編程框架的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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