sum: list(num) -> num; sum [ ] <= 0; sum(x::m) <= x + sum(m);We read this as follows: The sum of the empty list of integers is zero. To sum the list of integers whose head is
x and whose tail is m, we sum the tail, m and add
the head  x to the result.
How is this evaluated? Suppose we ask Hope to evaluate sum[2].
Now [2] is the list whose head is 2 and whose tail is [].
So [2]=2::[]. So sum[2]=sum(2::[]). This matches the second rule for sum with x=2 and m=[]. 
So we rewrite the right hand side of the second rule with
x=2 and m=[] to give 2+sum([]);
By the first rule for sum, sum([])=0 
so the result of sum[2] is 2+0 which is 2.