haskell - 我们能否获得任意类型生成类型的标识、常量和定点数据类型构造函数?

标签 haskell

以下是一些类型构造函数:

type T0 = Type

type I0 :: T0 -> T0
data I0 x = I0 { getI0 :: x }

type K0 :: T0 -> (T0 -> T0)
data K0 x y = K0 { getK0 :: x }

type Mu0 :: (T0 -> T0) -> T0
data Mu0 f = Mu0 { unMu0 :: f (Mu0 f) }
这里还有一些类型构造函数:
type T1 = Type -> Type

type I1 :: T1 -> T1
data I1 f x = I1 { getI1 :: f x }

type K1 :: T1 -> (T1 -> T1)
data K1 f g x = K1 { getK1 :: f x }

type Mu1 :: (T1 -> T1) -> T1
data Mu1 ff x = Mu1 { unMu1 :: ff (Mu1 ff) x }
我们可以将这些类型构造函数组织成一个数据族:
class Context (k :: Type)
  where
  data I :: k -> k
  data K :: k -> (k -> k)
  data Mu :: (k -> k) -> k

instance Context Type
  where
  data I x = I0 { getI0 :: x }
  data K x y = K0 { getK0 :: x }
  data Mu f = Mu0 { getMu0 :: f (Mu0 f) }

instance Context (Type -> Type)
  where
  data I f x = I1 { getI1 :: f x }
  data K f g x = K1 { getK1 :: f x }
  data Mu ff x = Mu1 { unMu1 :: ff (Mu1 ff) x }

instance Context (Type -> Type -> Type)
  ...

instance Context ((Type -> Type) -> Type)
  ...
这些定义是临时多态性的一个例子,因为我必须根据每个 Type 的具体情况费力地实例化该类。 - 生产我能想到的那种。是否可以以参数化多态的方式定义这些数据类型构造函数,以便我们拥有类似的数据类型构造函数:
type I :: forall k. k -> k
type K :: forall k. k -> (k -> k)
type Mu :: forall k. (k -> k) -> k
我可以在任何 Type 上实例化它在没有进一步仪式的情况下生产种类(例如为所述种类实例化一个类)?

最佳答案

CPS 类型的编码怎么样?A -> B(A -> Type) -> (B -> Type)所以在善良的层面上,我们想要

 I : (a -> Type) -> (a -> Type)
 K : a -> b -> (a -> Type) -> Type
 Fix : ((a -> Type) -> (a -> Type)) ->  (a -> Type) -> Type
我很容易只是
 newtype I x k = I (k x)
K 稍微硬一点
 newtype K a b k = K (k a)
我认为修复是
  newtype Fix f k = Fix (k (f (Fix f))
但我不太确定。

关于haskell - 我们能否获得任意类型生成类型的标识、常量和定点数据类型构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65556435/

相关文章:

haskell - 有条件地建立一个列表

haskell - 为什么 "between (char ' "') (char ' "') (many charLiteral)"不能用于解析字符串文字?

haskell - 合理的 Comonad 实现

windows - 如何在 ghci 中使用数学符号(函数名)?

haskell - 闭包(在 Haskell 中)

database - 在 Haskell 中处理数据库游标

haskell - Yesod 的莎士比亚模板(哈姆雷特)和 IO

haskell - 如何在haskell中实现嵌套函数

Haskell:如何在命令行中将 args 读取为 int?

haskell - Megaparsec:无法解析递归算术字符串