Edited to add my original solution. Christian's crack was different, but exploits the same basic features (you can get a surprising amount of computation done by accessing functions that have syntactic sugar, even when you can't call anything builtin directly or even name the types involved).
import Prelude(getLine,print)
a=a
(x:l)!0=x
(x:l)!n=l!d[0..n]
d[x,y]=x
d(x:l)=d l
x^y=[x..]!y
x+y=f[0..y](x^y)(-((-x)^(-y)))
f[]x y=y
f _ x y=x
f.g= \x->f(g x)
f&0= \x->x
f&n=f.(f&d[0..n])
x*y=((+x)&y)0
x%[]=x
x%('-':s)= -(x%s)
x%(c:s)=x*10+i c%s
i c=l['1'..c]
l[]=0
l(x:s)=1+l s
main=do
x<-getLine
y<-getLine
print((0%x)+(0%y))
Which probably isn't super-golfed anyway, but here it is more readibly:
import Prelude(getLine,print)
a=a
-- List indexing
(x : _) !! 0 = x
(_ : xs) !! n = xs !! (sndLast [0..n])
-- sndLast [0..n] lets us decrement a positive integer
sndLast [x, _] = x
sndLast (_ : xs) = sndLast xs
-- Pseudo-addition: right-operator must be non-negative
x +~ y = [x..] !! y
-- Generalised addition by sign-flipping if y is negative
x + y = switch [0..y] (x +~ y) (-((-x) +~ (-y)))
where switch [] _ empty = empty -- [0..y] is null if y is negative
switch _ nonempty _ = nonempty
f . g = \x -> f (g x)
-- compose a function with itself N times
composeN f 0 = \x -> x
composeN f n = f . (composeN f (sndLast [0..n]))
-- multiplication is chained addition
x * y = composeN (+x) y 0
strToNat acc [] = acc
strToNat acc ('-' : cs) = -(strToNat acc cs)
strToNat acc (c : cs) = strToNat (acc * 10 + charToDigit c) cs
charToDigit c = length ['1'..c]
length [] = 0
length (_ : xs) = 1 + length xs
main = do
x <- getLine
y <- getLine
print (strToNat 0 x + strToNat 0 y)