シリーズ 「関数型言語haskellの深遠」 リストの内包定義

u-noさんところより(http://d.hatena.ne.jp/u-no/20041214#p4)。
和が6となる4要素のリストを返す関数。ソース

test = [(a, b, c, d) | a <- [0..6], b <- [0..6], c <- [0..6], d <- [0..6], a + b + c + d == 6]

hugs(haskellインタプリタ)でのtestの実行結果

Main> test
[(0,0,0,6),(0,0,1,5),(0,0,2,4),(0,0,3,3),(0,0,4,2),(0,0,5,1),(0,0,6,0),(0,1,0,5\
),(0,1,1,4),(0,1,2,3),(0,1,3,2),(0,1,4,1),(0,1,5,0),(0,2,0,4),(0,2,1,3),(0,2,2,\
2),(0,2,3,1),(0,2,4,0),(0,3,0,3),(0,3,1,2),(0,3,2,1),(0,3,3,0),(0,4,0,2),(0,4,1\
,1),(0,4,2,0),(0,5,0,1),(0,5,1,0),(0,6,0,0),(1,0,0,5),(1,0,1,4),(1,0,2,3),(1,0,\
3,2),(1,0,4,1),(1,0,5,0),(1,1,0,4),(1,1,1,3),(1,1,2,2),(1,1,3,1),(1,1,4,0),(1,2\
,0,3),(1,2,1,2),(1,2,2,1),(1,2,3,0),(1,3,0,2),(1,3,1,1),(1,3,2,0),(1,4,0,1),(1,\
4,1,0),(1,5,0,0),(2,0,0,4),(2,0,1,3),(2,0,2,2),(2,0,3,1),(2,0,4,0),(2,1,0,3),(2\
,1,1,2),(2,1,2,1),(2,1,3,0),(2,2,0,2),(2,2,1,1),(2,2,2,0),(2,3,0,1),(2,3,1,0),(\
2,4,0,0),(3,0,0,3),(3,0,1,2),(3,0,2,1),(3,0,3,0),(3,1,0,2),(3,1,1,1),(3,1,2,0),\
(3,2,0,1),(3,2,1,0),(3,3,0,0),(4,0,0,2),(4,0,1,1),(4,0,2,0),(4,1,0,1),(4,1,1,0)\
,(4,2,0,0),(5,0,0,1),(5,0,1,0),(5,1,0,0),(6,0,0,0)]

少し拡張してみた。
sからeの範囲をとる4要素 で 足した和がnになるもののリストを返す関数

test s e n= [(a, b, c, d) | a <- [s..e], b <- [s..e], c <- [s..e], d <- [s..e],\
 a + b + c + d == n]

実行結果

Main> test (-1) 2 4
[(-1,1,2,2),(-1,2,1,2),(-1,2,2,1),(0,0,2,2),(0,1,1,2),(0,1,2,1),(0,2,0,2),(0,2,\
1,1),(0,2,2,0),(1,-1,2,2),(1,0,1,2),(1,0,2,1),(1,1,0,2),(1,1,1,1),(1,1,2,0),(1,\
2,-1,2),(1,2,0,1),(1,2,1,0),(1,2,2,-1),(2,-1,1,2),(2,-1,2,1),(2,0,0,2),(2,0,1,1\
),(2,0,2,0),(2,1,-1,2),(2,1,0,1),(2,1,1,0),(2,1,2,-1),(2,2,-1,1),(2,2,0,0),(2,2\
,1,-1)]

ちなみに型推論によるtestの型はこんなかんじ。

Main> :t test
test :: (Enum a, Num a) => a -> a -> a -> [(a,a,a,a)]

えーっと、4要素のほうを抽象化するにはどうすればいいのかな。