类型族作为类型同义词的参数

伊丽莎·勃兰特(Eliza Brandt)

我有一个看起来像的数据类型

data G f n a where 
  G :: a -> G f n a -> G f (f n) a 

它是由自然索引的容器,它具有确定如何归纳进行处理的功能。

我可以像这样轻松定义类型同义词

type G' n a = G S n a

但我希望能够使用身份功能。

我尝试使用Data.Functor.Identity,但是即使使用PolyKinds重新定义,我也无法在Naturals(:k Identity => Nat -> Nat上获得类型级别的函数,因此我转向了类型族,定义了

type family Id a where 
  Id a = a 

可以编译。不幸的是,我提供type G'' n a = G Id n a了错误消息

The type family ‘Id’ should have 1 argument, but has been given none
In the type synonym declaration for ‘G''’

那么有什么方法可以在类型同义词中使用类型族?这似乎是理想的最终状态。

(我当前使用的扩展名是{-# LANGUAGE GADTs, TypeFamilies, DataKinds, TypeInType, PolyKinds #-}

本杰明·霍奇森

您不能在不饱和对象周围传递类型族(或类型同义词),但是可以在代表该类型族的标记周围传递。然后,当需要将类型族应用于参数时,您可以查找给定的标记。

type family Apply (token :: *) (n :: Nat) :: Nat

data G token n a where
    G :: a -> G token n a -> G token (Apply token n) a

现在,您可以定义令牌以及如何应用它们。

data SToken
type instance Apply SToken n = S n

data IdToken
type instance Apply IdToken n = n

和你的同义词:

type G' = G SToken
type GId = G IdToken

这种技巧-绕过函数而不是函数本身的表示形式-被称为去功能化最初是在70年代开发的,是一种用于高阶功能编程语言的实现技术。(顺便说一下,那篇论文读起来很棒。)

我不知道这是否是您想要做的唯一方法,但是或多或少地是怎么singletons做的。更多信息singletons作者的博客

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

找出类型同义词的类型

类型同义词导致类型错误

在haskell中查找类型同义词

让Haskell区分类型同义词

使用类型同义词定义实例

定义类型同义词(GHC)的类型同义词时出现奇怪的错误

您为什么不能(完全)应用带有使用其他类型同义词的参数的类型同义词?

在类型声明映射中使用类型同义词

为什么关联的类型同义词不暗示约束

我的Haskell类型同义词有什么问题?

基于lambda / church布尔值的类型同义词

使用模板Haskell获取关联的类型同义词

如何在实例声明中使用类型同义词?

Java泛型和类型同义词

一个类中的多个类型同义词

使用特定的类定义类型同义词

如何为类型类名称创建同义词?

Purescript 将类视为循环类型同义词

Haskell术语:类型与数据类型的含义,它们是同义词吗?

模式同义词无法统一类型级别列表中的类型

由类型同义词中的函数依赖项绑定的“自由”类型变量

无法制作具有类型同义词的对象:类型

我可以轻松地将我的元组类型同义词设为Read的实例吗?

模式同义词能否在每个方向都有不同的类型签名,就像数字文字那样?

如何为F#中的各种角色定义int,float等的类型同义词?

Haskell中是否可能有健忘的类型同义词?

是否存在部分类型同义词实例的Haskell(GHC)扩展?

Data.Semigroup中的ArgMin和ArgMax类型同义词的目的是什么?

Haskell:实例中的非法类型同义词系列应用程序