(* Data type definitions *)
type t =
| True
| False
| If of t * t * t
| Zero
| Succ of t
| Pred of t
| IsZero of t
let rec isNumber t =
match t with
Zero -> true
| Succ t1 -> isNumber t1
| _ -> false
When we call isNumber give pattern (Succ (Succ (Succ (Succ Zero)))), how this works?
>Solution :
The t type is recursive. As you’ve seen, it can be constructed with Succ which takes another value of type t, which could itself be constructed with Succ, and so on.
The isNumber function is likewise recursive. If it finds the Succ t1 pattern, it calls isNumber on t1.
For your sample value of Succ (Succ (Succ (Succ Zero))) it looks like:
isNumber (Succ (Succ (Succ (Succ Zero))))
isNumber (Succ (Succ (Succ Zero)))
isNumber (Succ (Succ Zero))
isNumber (Succ Zero)
isNumber Zero
true