简体   繁体   中英

Check cnat. and got Type return

All

I am trying to understand the Church numerals, mentioned in the SF-LF book, chp4.

Definition cnat := forall X : Type, (X -> X) -> X -> X.
Definition one : cnat :=
  fun (X : Type) (f : X -> X) (x : X) => f x.
Check cnat.
Check one.

And I get

cnat
     : Type
one
     : cnat

It seems cnat is some kind of type, and function at the same time. How can it be both type and function? Anyone can help explain a little more about this?

The " forall (X: Type), " syntax is a way to form a type, from a type parameterized by X . forall (X: Type), (X -> X) -> X -> X is a type of functions , which given a type X produce a value of type (X -> X) -> X -> X (which is itself a function).

The " fun (X: Type) => " syntax is a way to form a function, from a term parameterized by X . fun (X: Type) (f: X -> X) (x: X) => fx is a function , which given a type X produce the function fun (f: X -> X) (x: X) => fx (which is itself a function).

What fun and forall have in common is that they involve binders , like (X: Type) (also like (f: X -> X) , (x: X) ). fun is a construct that involves binders to form functions, but not all constructs that involve binders form functions: forall is a construct that involves binders to form types.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM