gpt4 book ai didi

haskell - 从 Data.Data.Data 了解 gfoldl 的类型签名

转载 作者:行者123 更新时间:2023-12-03 20:41:31 27 4
gpt4 key购买 nike

Data 定义为其核心功能之一 gfoldl :

gfoldl
:: (Data a)
=> (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> a
-> c a
c的目的是什么?和 c (d -> b)在里面?为什么它不只是一个普通的折叠,比如
gfoldl'
:: (Data a)
=> (forall d. Data d => r -> d -> r)
-> r
-> a
-> r

最佳答案

这个想法是 Haskell 中代数数据类型的值具有以下形式

C x_1 x_2 ... x_n

在哪里 C是构造函数, x_i是论据。什么
gfoldl app con

所做的就是把这样一个值变成
con C `app` x_1 `app` x_2 ... `app` x_n

从而转动 a变成 c a .让我们假设 C 的类型是
C :: T_1 -> T_2 -> ... -> T_n -> D

那么我们来看看中间表达式的类型:
con C                                   :: c (T_1 -> T_2 -> ... -> T_n -> D)
con C `app` x_1 :: c (T_2 -> ... -> T_n -> D)
con C `app` x_1 `app` x_2 :: c (... -> T_n -> D)
con C `app` x_1 `app` x_2 ... `app` x_n :: c D
c 上的参数化允许所有这些中间类型
不同的。如果我们使用简单的折叠,例如 gfoldl'相反,那么所有
这些中间类型必须相同。
gfoldl 的动机是一个
让您表达 SYB 函数的单一概括 gmapQgmapT (和其他一些人)。 gmapQ 的类型和 gmapT是:
gmapQ :: Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapT :: Data a => (forall b. Data b => b -> b) -> a -> a

gmapQ折叠 a进入 u 的统一列表s 并且可以
gfoldl' 表示,这对于 gmapT 是不可能的.

但是,使用 gfoldl , 我们可以使用 c = Identity使我们能够得到
类似于 gmapT , 和 c = Const得到类似 gmapQ 的东西.

有关更多详细信息,您可能还想查看论文 Scrap your boilerplate Reloaded这表明 gfoldl是一个普通的(然而
称为 Spine 的数据类型的高阶)折叠在那篇论文中。

使用恒等仿函数来获得变换和
从单个底层表示更新行为有一些
类似于从“van Laarhoven”镜头获得镜头操作的方式。

关于haskell - 从 Data.Data.Data 了解 gfoldl 的类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29119986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com