由于我不熟悉秩-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
等其他函数也有类似的问题。那么,有什么值得注意的例子来说明它们的重要用途呢?
发布于 2019-08-07 14:28:01
对于gmapT
情况,在最初的文章中定义了mkT
函数。
mkT :: (Typeable a, Typeable b ) => (b -> b) -> a -> a
mkT f = fromMaybe id (cast f)
例如,要增加A
中的所有A
字段,可以编写以下内容
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)
发布于 2019-08-07 14:20:39
Data.Data
是一个名为“报废样板”的通用元编程框架的一部分。
Data.Data
模块链接到关于主题boilerplate.21的研究出版物列表。Data.Data
和syb链接),但遗憾的是,它现在似乎已经死了。Data.Data
作为具有一些一致性特性的通用随机生成器。https://stackoverflow.com/questions/57389874
复制相似问题