You say you want the numbers 1..100, but mention 0 in the examples. Also, you say βevery combination,β but don't mention (1,0,0) .
[(a,b,c) | m<-[0..100], a<-[0..m], b<-[0..m], c<-[0..m] ]
to avoid duplication, list them in order of their total amount:
let l = 100; in [(a,b,c) | m<-[0..3*l], a<-[0..l], b<-[0..l], c<-[0..l], a+b+c == m ]
The calculation can be accelerated (keeping the same result), narrowing the possible ranges:
let l = 100; in [(a,b,mab) | m<-[0..3*l], a<-[(max 0 (m-2*l))..(min lm)], b<-[(max 0 (mal))..(min l (ma))] ]
source share