idris - 如何创建一个只接受其他字段的字段?

标签 idris

我想创建一个具有交替构造函数 FooBar 的数据类型。例如,有效的成员是:

Foo (Bar (Foo (Bar End)))

但不是:

Foo (Foo (Bar End))

因为后者有两个连续的 Foo。在单个数据声明中表达这一点的正确方法是什么?

最佳答案

使用单个声明,您需要一个索引类型:

data Foo : Bool -> Type where
  End : Foo True
  Bar : Foo True -> Foo False
  Foo : Foo False -> Foo True

这与以下两种共同类型具有相同的居民:

data FooTrue = End | Foo FooFalse
data FooFalse = Bar FooTrue

一般来说,n 数据类型的共同族可以用由具有 n 元素的类型索引的单一类型族来表示。索引表示的优点是它允许通用操作,而这些操作对于相互类型来说是不可能的,因为可以对 {b : Bool} -> Foo b -> Foo b 等类型进行转换{b : Bool} -> Foo b -> Foo(不是 b)。像长度索引列表这样的无限共同族也只能通过索引类型实现。

关于idris - 如何创建一个只接受其他字段的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723797/

相关文章:

idris - 为什么 Idris 将值名称与随后定义的类型参数名称混为一谈?

haskell - 将存在主义提升到类型层面

haskell - 为什么 GHC Haskell 不支持重载记录参数名称?

syntax - Idris 教程 - 中缀形式的命名实现函数

idris - 在 Idris 中强制一个参数大于另一个参数

coq - 为什么依赖类型语言使用弱头范式来比较可转换性

idris - Idris 的 `BorrowedType` 背后的意图是什么?

scala - 路径依赖类型 : Idris to Scala

polymorphism - 查找归纳定义类型的(显示)实现

idris - 为什么这个 'with' block 会破坏这个函数的完整性?