main=do a:b:c:d<-getLine;read(a:[b])%read d
a%b=mapM putStrLn[["|-+"!!((x-a-max(1-y)(y-b))#(min(b+1-y)(max(y-1)1)-x))|x<-[1..a]]|y<-[1..b]]
a#b=sum[0^(a*b)+1|a<=0&&b<=0]
教えてもらった技をふんだんに使ったが、長くなってしまった。。。
【番外編2】 169バイト
main=do a:b:c:d<-getLine;read(a:[b])%read d
a%b=mapM putStrLn[["|-+"!!((a-x+max(1-y)(y-b))#(x-min(b+1-y)(max(y-1)1)))|x<-[1..a]]|y<-[1..b]]
a#b=sum[0^(a*b)+1|min a b>=0]