首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Data.Data?

如何使用Data.Data?
EN

Stack Overflow用户
提问于 2019-08-07 08:16:44
回答 2查看 367关注 0票数 2

由于我不熟悉秩-N类型,所以gfoldl的类型签名对我来说是个麻烦:

代码语言:javascript
运行
复制
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等其他函数也有类似的问题。那么,有什么值得注意的例子来说明它们的重要用途呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-07 14:28:01

对于gmapT情况,在最初的文章中定义了mkT函数。

代码语言:javascript
运行
复制
mkT :: (Typeable a, Typeable b ) => (b -> b) -> a -> a
mkT f = fromMaybe id (cast f)

例如,要增加A中的所有A字段,可以编写以下内容

代码语言:javascript
运行
复制
data A = A {f :: Int, s :: Int} deriving (Data, Typeable)

ex = gmapT (mkT inc) (A 2 3) where 
  inc :: Int -> Int
  inc = (+1)

为了更清楚地说明,ex函数也可以这样编写:

代码语言:javascript
运行
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2019-08-07 14:20:39

Data.Data是一个名为“报废样板”的通用元编程框架的一部分。

  • Data.Data模块链接到关于主题boilerplate.21的研究出版物列表。
  • syb库中充满了泛型转换的示例,特别是方案模块
  • 以前有一个SYB (从Data.Data和syb链接),但遗憾的是,它现在似乎已经死了。
  • 对于另一种类型的例子,玻尔兹曼取样器 (我是作者)使用Data.Data作为具有一些一致性特性的通用随机生成器。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57389874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档