関数型!侵略ノススメ☆

(この記事は Functional Ikamusume Advent Calendar jp 2010 の為に書かれました)

侵略!侵略!侵略!侵略!侵略!侵略!イカ娘

再帰しなイカ

main = putStrLn $ f 6 where
 f 0 = "イカ娘!"
 f n = "侵略!" ++ f (n-1)

古風に再帰しなイカ

main = putStrLn $ f 6 where
 f 0 = "イカ娘!"
 f (n+1) = "侵略!" ++ f n

左派じゃなイカ

main = putStrLn $ foldl (\a _ -> "侵略!"++a) "イカ娘!" [1..6]

右派じゃなイカ

main = putStrLn $ foldr (\_ a -> "侵略!"++a) "イカ娘!" [1..6]

右派に見せかけた左派じゃないか?

main = putStrLn $ foldr (\_ g n -> g ("侵略!"++n)) id [1..6] "イカ娘!"

const教じゃなイカ

main = putStrLn $ foldr (const ("侵略!"++)) "イカ娘!" [1..6]

ポイントフリーじゃなイカ

ika = foldr (const ("侵略!"++)) "イカ娘!" . enumFromTo 1
main = putStrLn $ ika 6

繰り返さなイカ

main = putStrLn $ until ((>=18+4) . length) ("侵略!"++) "イカ娘!"

メモ化しなイカ

ikas = "イカ娘!" : map ("侵略!"++) ikas
main = putStrLn $ ikas !! 6

メモ化しなイカ(その2)?

main = putStrLn $ iterate ("侵略!"++) "イカ娘!" !! 6

継続渡さなイカ

ikac k 0 = k "イカ娘!"
ikac k n = ikac (k . ("侵略!"++)) (n-1)
main = putStrLn $ ikac id 6

不動点じゃなイカ

import Control.Monad.Fix
main = putStrLn $ take 18 (fix $ \侵略s -> "侵略!"++侵略s) ++ "イカ娘!"

もっと不動点じゃなイカ

import Control.Monad.Fix
main = putStrLn $ (fix $ \f n -> if n==0 then "イカ娘!" else "侵略!" ++ f (n-1)) 6

モナド使わなイカ

main = putStrLn $ (do [1..6];"侵略!")++"イカ娘!"

Haskellと言ったらリスト内包表記じゃなイカ

main = putStrLn $ foldr (.) (const "イカ娘!") [("侵略!"++)|_<-[1..6]] $ ""

手続き型やらなイカ

for b e m
  | b == e = return()
  | otherwise = do
    m b
    for (b+1) e m

main = do
  for 0 6 $ \i -> do
    putStr "侵略!"
  putStrLn "イカ娘!"

熟練した手続き型Haskellerはこう書くでゲソ!

main = forM_ [1..6] (const $ putStr "侵略!") >> putStrLn "イカ娘!"

手続き型に侵略されたでゲソ!

import Control.Monad
import Data.IORef
import System.IO.Unsafe

イカ = unsafePerformIO $ newIORef "イカ娘!"

main = do
  forM_ [0..6] $ \_ -> do
    modifyIORef イカ ("侵略!"++)
  putStrLn =<< readIORef イカ

エンコードしなイカ

import Numeric
main=putStrLn$showIntAtBase 6(toEnum.fromInteger.(`mod`10^5).div 652812306412459124522040530053.(10^).(*5))25099952825734985""

ちょうど140文字でゲソ!

普通に書かなイカ

main = putStrLn $ concat (replicate 6 "侵略!") ++ "イカ娘!"

普通に書かなイカ(その2)?

main = putStrLn $ take 18 (cycle "侵略!") ++ "イカ娘!"

ゴルフしなイカ

main=putStrLn$([1..6]>>"侵略!")++"イカ娘!"

これでいいんじゃなイカ

main = putStrLn "侵略!侵略!侵略!侵略!侵略!侵略!イカ娘!"

※この記事は以下のページの関数型イカ娘風パロディでゲソ!
http://www.willamette.edu/~fruehr/haskell/evolution.html