mik*_*ike 2 types functional-programming algebraic-data-types agda gadt
在 Agda 中的依赖类型编程的第 4 页上,List
定义如下
infixr 40 _::_
data List (A : Set) : Set where
[] : List A
_::_ : A -> List A -> List A
Run Code Online (Sandbox Code Playgroud)
我很难将头环绕在最后一行。前阵子学过一些 Haskell,所以对cons运算符比较熟悉。
那么,要么你有一个空列表,它是 type List A
,或者你创建一个带有::
type函数的新值A -> List A -> List A
,它接受一些 type 元素A
和一个 type 列表A
并返回一个新列表?
这似乎是直觉,但这并没有映射到我所知道的递归数据类型定义的概念(来自haskell),例如
data Tree a = Leaf a | Branch (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)
问题那么这是一种什么样的类型呢?这里涉及到Agda的哪些概念?
在 Haskell 和 Agda 中有两种定义数据类型的语法。
简单一:
data List a = Nil | a :# List a
Run Code Online (Sandbox Code Playgroud)
更有表现力的一个(在 Haskell 中它用于定义GADTs):
{-# LANGUAGE GADTs #-}
data List a where
Nil :: List a
(:#) :: a -> List a -> List a
Run Code Online (Sandbox Code Playgroud)