アルファベットの繰り上がり

エロと風俗情報満載 どう抜く?より。リストモナド。カンマを間に挟んで出力するのはfoldl1が便利かも。1がポイント。

module Main (main) where

columnNumbers :: [String]
columnNumbers = 
  map f [c1 : c2 : [] | c1 <- ' ' : ['A' .. 'Z'], c2 <- ['A' .. 'Z']]
  where
    f (' ' : xs) = xs
    f xs = xs

main :: IO ()
main = putStrLn $ foldl1 (\ r s -> r ++ ", " ++ s) $ take 100 columnNumbers

出力: (適当に改行しています。)

A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, AA
, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AU
, AV, AW, AX, AY, AZ, BA, BB, BC, BD, BE, BF, BG, BH, BI, BJ, BK, BL, BM, BN, BO
, BP, BQ, BR, BS, BT, BU, BV, BW, BX, BY, BZ, CA, CB, CC, CD, CE, CF, CG, CH, CI
, CJ, CK, CL, CM, CN, CO, CP, CQ, CR, CS, CT, CU, CV

(追記)
アルファベットの繰り上がり - sshi.Continual
そうかー。intersperseなんてものがありました。(putStrLn . concat . intersperse ", ")でOKです。