s n=show n++take(n*2+9)" shinichiroes"++" of hamaji"
w n=s n++" on the wall"
a#b=a++", "++b++".\n"
f 1="Go to the store and buy some more"#w 99
f x="Take one down and pass it around"#w(x-1)
main=mapM putStrLn[w n#s n++f n|n<-[99,98..1]]
【修正後】 235 バイト
s n=shows n" shinichiro"++drop(4-2*n)"es of hamaji"
w n=s n++" on the wall"
a#b=a++", "++b++".\n"
f 1="Go to the store and buy some more"#w 99
f x="Take one down and pass it around"#w(x-1)
main=mapM putStrLn[w n#s n++f n|n<-[99,98..1]]
ついに、235バイト!!
【その他 1】 237 バイト
s n=shows n" shinichiro"++drop(4-2*n)"es of hamaji"
w n=s n++" on the wall"
a#b=a++", "++b++".\n"
f 1="Go to the store and buy some more"#w 99
f x="Take one down and pass it around"#w(x-1)
g n|n>0=putStrLn(w n#s n++f n)>>g(n-1)
main=g 99
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]
main=getLine>>=g.f
f(a:b:'x':c)=[read(a:b:"")-1,read c-1]
g[a,b]=mapM putStrLn[["+|-"!!h x y a b|x<-[0..a]]|y<-[0..b]]
y%b=min(max(y-1)0)(-y+b)
y#[a,b]=max(y+a-b)(-y+a)
h x y a b|x<y%b||x>y#[a,b]=1|x==y%b||x==y#[a,b]=0|1>0=2
main=do a:b:c:d<-getLine;g[read(a:[b])-1,read d-1]
g[a,b]=mapM putStrLn[["+|-"!!h x y a b|x<-[0..a]]|y<-[0..b]]
y%b=min(max(y-1)0)(b-y)
y#[a,b]=max(y+a-b)(a-y)
h x y a b|x<y%b||x>y#[a,b]=1|x==y%b||x==y#[a,b]=0|1>0=2
main=do a:b:c:d<-getLine;g[read(a:[b])-1,read d-1]
g[a,b]=mapM putStrLn[["+|-"!!h x y a b|x<-[0..a]]|y<-[0..b]]
y%b=min(max(y-1)0)(b-y)
h x y a b|x<y%b||x>max(y+a-b)(a-y)=1|x==y%b||x==max(y+a-b)(a-y)=0|1>0=2
【修正3】 181バイト
main=do a:b:c:d<-getLine;f$map read[a:[b],d]
f[a,b]=mapM putStrLn[["+|-"!!h(max(y+a-b)(a-y+1))x(min(max(y-1)1)(b+1-y))y|x<-[1..a]]|y<-[1..b]]
h s x t y|x<t||x>s=1|x==t||x==s=0|1>0=2
【修正4】 179バイト
main=do a:b:c:d<-getLine;f$map read[a:[b],d]
f[a,b]=mapM putStrLn[["+|-"!!h(x-max(y+a-b)(a-y+1))(x-min(max(y-1)1)(b+1-y))|x<-[1..a]]|y<-[1..b]]
h a b|b<0||a>0=1|b==0||a==0=0|1>0=2
【修正5】 178バイト
main=do a:b:c:d<-getLine;f$map read[a:[b],d]
f[a,b]=mapM putStrLn[["+|-"!!h(max(y+a-b)(a-y+1))x(min(max(y-1)1)(b+1-y))|x<-[1..a]]|y<-[1..b]]
h s x t|x<t||x>s=1|x==t||x==s=0|1>0=2
main=do a:b:c:d<-getLine;f$map read[a:[b],d]
f[a,b]=mapM putStrLn[["+|-"!!h(x-max(y+a-b)(a-y+1))(x-min(max(y-1)1)(b+1-y))|x<-[1..a]]|y<-[1..b]]
h a b|a>0||b<0=1|a*b==0=0|1>0=2