To model what Joey Adams did:
g>replicateM 3 [1..2] [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]]
For a complete solution (give it a list and get 3 tuples), you can do something like this:
g>let cube = map (\(a:b:c:_) -> (a, b, c)) . replicateM 3 cube :: [t] -> [(t, t, t)] (0.00 secs, 526724 bytes) g>cube [1..2] [(1,1,1),(1,1,2),(1,2,1),(1,2,2),(2,1,1),(2,1,2),(2,2,1),(2,2,2)] it :: [(Integer, Integer, Integer)]
But IMHO, the decision of Edward Z. Young dominates.