iterate
アルファベットの繰り上がりです。ZZ→AAAに対応したかったのですが良い方法が考えられませんでした。
import Char import List main = putStr $ concat $ List.intersperse ", " $ take 100 $ map toAlphaStr [1..] toAlphaStr :: Int -> String toAlphaStr n = let (x, y) = divMod (n-1) 26 in if x > 0 then [toAlpha (x-1)] ++ [toAlpha y] else [toAlpha y] toAlpha :: Int -> Char toAlpha n = Char.chr(n + 65)
投稿されているものを見るとiterateを使っているものを発見、iterateを知らなかったので自分でも書いてみました。
import Char import List main = putStr $ concat $ List.intersperse ", " $ take 100 $ iterate next "A" next :: String -> String next [] = "A" next s = let r = reverse s h = head r -- 一桁目 u = (reverse.tail) r -- 二桁目以降 in if h == 'Z' then next(u) ++ "A" else u ++ [Char.chr(Char.ord(h) + 1)]
これは何回もreverseしていて無駄な感じがしますが、投稿されていたものはreverseの回数を抑えていました。