nil :: List cons :: Int -> List -> List gcd :: Int -> Int -> Int gcd(n, m) -> gcd(-n, m) | n < 0 gcd(n, m) -> gcd(n, -m) | m < 0 gcd(n, 0) -> n gcd(n, m) -> gcd(m, n % m) | n >= 0 /\ m > 0 fold :: (Int -> Int -> Int) -> Int -> List -> Int fold(F, n, nil) -> n fold(F, n, cons(x, y)) -> F(x, fold(F, n, y)) gcdlist :: List -> Int gcdlist(l) -> fold(gcd, 0, l)