関数型!侵略ノススメ☆
(この記事は Functional Ikamusume Advent Calendar jp 2010 の為に書かれました)
侵略!侵略!侵略!侵略!侵略!侵略!イカ娘!
左派じゃなイカ?
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 $ (fix $ \f n -> if n==0 then "イカ娘!" else "侵略!" ++ f (n-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