是否存在这种"通用"Haskell类型?

Lar*_*jes 6 haskell

我正在寻找具有以下属性的Haskell类型A(使用异国情调的GHC扩展对我来说很好......):对于所有可遍历的t,以下两种类型是同构的:

forall a. C a => t a -> a
Run Code Online (Sandbox Code Playgroud)

t A -> A.
Run Code Online (Sandbox Code Playgroud)

在我的具体情况中,C是以下类:

class Floating a => C a where
    fromDouble :: Double -> a
Run Code Online (Sandbox Code Playgroud)

换句话说,我有点想拉全称量化在所有类型的ç入式一个,这样一个函数T A - >一个给我回了一个功能一个.所以我想我正在寻找某种意义上的C级"通用"实例......

我已经考虑了各种花哨的定义,沿行

newtype A = A (forall b. C b => b)
Run Code Online (Sandbox Code Playgroud)

要么

data A = forall b. C b => A b
Run Code Online (Sandbox Code Playgroud)

要么

newtype A = A (forall t b. (Traversable t, C b) => t b -> b),
Run Code Online (Sandbox Code Playgroud)

要么

data A = FromDouble Double | Plus A A | Tanh A | ...
Run Code Online (Sandbox Code Playgroud)

甚至

data A = A (forall t. Traversable t => t A -> A),
Run Code Online (Sandbox Code Playgroud)

并且它们都可以很容易地成为C类的实例,但它们没有我需要的属性(或者至少我没有看到如何从我上面的任何定义中获取该属性).

在奇怪的日子里,我确信A型根本就不存在,即便是在相信的情况下,我也相信......

...所以任何帮助都将受到高度赞赏!


为了让一些动机我的问题:我扶着严重的爱德华Kmett的广告库为我的神经网络库,并在我的第一次尝试,我用他的Numeric.AD.Rank1.Kahn型自动分化和反向传播.这导致了一个不错的API,但效率低于他的反向模式,不幸的是,我在问题中使用量化来编码可微分函数.

我希望我可以拥有两个世界中最好的 - 一个特定的(抽象)类型加上反向模式效率.

chi*_*chi 12

我们假设A存在这种"通用"类型.

Const () 是可遍历的,因此我们得到了一个同构

forall a. C a => Const () a -> a
-- and
Const () A -> A
Run Code Online (Sandbox Code Playgroud)

即之间(因为Const () a是同构的(),并且() -> b是同构的b)

forall a. C a => a
-- and
A
Run Code Online (Sandbox Code Playgroud)

所以,如果A存在,它必须是同构的forall a. C a => a.

请注意,这是您第一次尝试解决方案 - 如果不满足要求,那么什么都不会.


现在,在你的具体情况下

forall a. C a => a
Run Code Online (Sandbox Code Playgroud)

大致意思是,按C(*)的定义[注意:这里我错误地"忘记了" Floating a超类,整个论证更加脆弱]

forall a. (Double -> a) -> a
Run Code Online (Sandbox Code Playgroud)

这是同构的Double:

iso :: Double -> forall a. (Double -> a) -> a
iso x f = f x
osi :: (forall a. (Double -> a) -> a) -> Double
osi f = f id
Run Code Online (Sandbox Code Playgroud)

证明上述实际上是同构是非平凡的 - 我认为它需要一些参数化,如"免费的递归类型!" .(Yoneda的后果?...评论欢迎!)

所以 - 如果有一个解决方案,C那么它必须是A ~ Double同构的.

(*)我在这里伸展的东西.我不知道如何精确处理Haskell的有限量化,所以我诉诸于使字典显式,即使我猜,它不完全相同.