Alright, time to fire up ghci then.. it doesn't work with map or filter, but you get the idea:
notes = concat $ repeat ["c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "b"]
majorSteps = [1,1,0,1,1,1,0]
scale key steps =
key : skip notesFromKey majorSteps
where
(_:notesFromKey) = dropWhile ((/=) key) notes
skip list skips =
fst $ foldl next ([], list) skips
where
next (m, xs) s = (m ++ [xs !! s], drop (s + 1) xs)
edit: cleaned it up a lot. This is Haskell by the way. The loop is replaced by a 'fold' in the skip function that reduces the list by skipping through it taking the skip distances from the skips argument.