(* A version that doesn't hide swb *) (* swb = subtract with borrow *) fun swb b [] [] = if b=0 then [] else [~b] | swb b l [] = swb b l [0] | swb b [] r = swb b [0] r | swb b (l::ls) (r::rs) = let val digit = l - b - r; in if digit >= 0 then digit :: (swb 0 ls rs) else (digit + 10) :: (swb 1 ls rs) end; fun subDigitList l r = swb 0 l r; (* a better version that does hide swb using local *) local fun swb b [] [] = if b=0 then [] else [~b] | swb b l [] = swb b l [0] | swb b [] r = swb b [0] r | swb b (l::ls) (r::rs) = let val digit = l - b - r; in if digit >= 0 then digit :: (swb 0 ls rs) else (digit + 10) :: (swb 1 ls rs) end; in fun subDigitList l r = swb 0 l r; (* could also have written it as: val subDigitList = swb 0;*) end;