haskell - 如何在 CPS 中构建更高等级的 Coyoneda 类型的值?

标签 haskell unification higher-rank-types

{-# LANGUAGE RankNTypes #-}

newtype Coyoneda f a = Coyoneda {
  uncoyo :: forall b r. ((b -> a) -> f b -> r) -> r
}

coyoneda f tx = Coyoneda (\k -> k f tx)
我想 Coyoneda应该通过模拟更高等级类型的存在来工作,但我无法构造这种类型的值。 coyoneda辅助函数不进行类型检查,因为关于术语 k f tx高阶类型变量 b会脱离它的范围。
但是,我想不出另一种实现方式 coyoneda .有可能吗?

最佳答案

A型T同构于

forall r . (T -> r) -> r
根据米田同构。
在你的情况下,
forall b r. ((b -> a) -> f b -> r) -> r
~=  -- adding explicit parentheses
forall b . (forall r. ((b -> a) -> f b -> r) -> r)
~=  -- uncurrying
forall b . (forall r. ((b -> a, f b) -> r) -> r)
~=  -- Yoneda
forall b . (b -> a, f b)
这不是你想要的。要使用 coyoneda,您需要对存在类型进行建模:
exists b . (b -> a, f b)
所以,让我们把它变成 forall
exists b . (b -> a, f b)
~=  -- Yoneda
forall r . ((exists b . (b -> a, f b)) -> r) -> r
~=  -- exists on the left side of -> becomes a forall
forall r . (forall b . (b -> a, f b) -> r) -> r
~=  -- currying
forall r . (forall b . (b -> a) -> f b -> r) -> r
因此,这是您需要在 Coyoneda 中使用的正确编码。定义。

关于haskell - 如何在 CPS 中构建更高等级的 Coyoneda 类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68699612/

相关文章:

testing - 在 Ubuntu 上找不到模块 `Test.QuickCheck'

haskell - 预组合单子(monad)更改器(mutator)

haskell - 如何在 Haskell 应用程序中固定依赖项

haskell - 约束消失的情况: Oddities of a higher-rank type

haskell - 将函数定义更改为无点样式

types - 要统一的类型变量出现在类型中

javascript - Clojure 启发的传感器可以使用 HM 类型系统进行类型化吗?

haskell - 禁止赋值

haskell - 实例声明的RankNTypes?

haskell - 这些显式的 "forall"在做什么?