move  up
add type inference, HM type system