2
votes

On page 4 of Dependently Typed Programming in Agda, List is defined as follows

infixr 40 _::_
data List (A : Set) : Set where
  [] : List A
  _::_ : A -> List A -> List A

I have difficulties wrapping my head around the last line. I've learned some Haskell a while ago, so I am familiar with the cons operator.

So, either you have an empty list, which is of type List A, or you create a new value with function :: of type A -> List A -> List A, which takes some element of type A and a list of type A and returns a new list?

This seems to be the intuition, but this does not map to the concept of recursive data type definitions as I know it (from haskell), e.g.

data Tree a = Leaf a | Branch (Tree a) (Tree a)

Question So what kind of type is this? What concepts of Agda are involved here?

1

1 Answers

5
votes

There are two syntaxes to define data types in Haskell and Agda.

Simple one:

data List a = Nil | a :# List a

And more expressive one (in Haskell it is used to define GADTs):

{-# LANGUAGE GADTs #-}
data List a where
    Nil :: List a
    (:#) :: a -> List a -> List a