非カリー化

どう書く?org - ピラミッドを作る
初めて uncurry が欲しくなる場面に会った。
こんな風にデータがtupleとして固着しているときには、データの方をバラすんではなく、関数の方を uncurry してしまう方がすっきりする。

pyramid :: Int -> String
pyramid n = unlines $ map lineUp [1..n]
    where
      lineUp x = uncurry replicate =<< [(n-x, ' '), (2*x-1, '*')]

main :: IO ()
main = do putStr "> "
          x <- getLine
          putStr $ pyramid (read x)
          main