Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
第4回 スタート Haskell2 第9章
mizu__tama
September 09, 2012
0
350
第4回 スタート Haskell2 第9章
mizu__tama
September 09, 2012
Tweet
Share
More Decks by mizu__tama
See All by mizu__tama
第2回 スタートHaskell2 3. 関数の構文
mizu__tama
2
510
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
169
20k
Code Reviewing Like a Champion
maltzj
506
37k
Debugging Ruby Performance
tmm1
65
10k
From Idea to $5000 a Month in 5 Months
shpigford
373
44k
Designing for humans not robots
tammielis
242
24k
Unsuck your backbone
ammeep
659
55k
What's in a price? How to price your products and services
michaelherold
229
9.4k
It's Worth the Effort
3n
172
26k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
119
28k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
236
1.1M
KATA
mclloyd
7
8.9k
GraphQLの誤解/rethinking-graphql
sonatard
31
6.8k
Transcript
ୈ9ষ ͬͱೖྗɺͬͱग़ྗ !NJ[V@@UBNB 129݄9༵
ͬͱೖྗɺͬͱग़ྗ wϑΝΠϧ wίϚϯυϥΠϯҾ wཚ wCZUFTUSJOH 129݄9༵
ϑΝΠϧͱετϦʔϜ w)BTLFMMͰετϦʔϜσʔλΛ ؆୯ʹѻ͏ํ๏ wԆ*0ͷಈ࡞ 129݄9༵
ೖྗͷϦμΠϨΫτ import Control.Monad import Data.Char main = forever $ do
l <- getLine putStrLn $ map toUpper l Q HIDNBLFDBQTMPDLFS DBQTMPDLFSIBJLVUYU 129݄9༵
ೖྗͷϦμΠϨΫτ import Control.Monad import Data.Char main = forever $ do
l <- getLine putStrLn $ map toUpper l Q HIDNBLFDBQTMPDLFS DBQTMPDLFSIBJLVUYU 129݄9༵
HFU$POUFOUT HFU$POUFOUT*04USJOH import Data.Char main = do contents <- getContents
putStr $ map toUpper contents w ඪ४ೖྗ͔Β&0'จࣈʹୡ͢Δ·Ͱ ͯ͢ͷจࣈΛಡΈࠐΉ w Ԇ*0Λߦ͏ Q 129݄9༵
HFU$POUFOUT HFU$POUFOUT*04USJOH import Data.Char main = do contents <- getContents
putStr $ map toUpper contents w ඪ४ೖྗ͔Β&0'จࣈʹୡ͢Δ·Ͱ ͯ͢ͷจࣈΛಡΈࠐΉ w Ԇ*0Λߦ͏ Q ΠέͯΔʂ 129݄9༵
Ԇ*0 import Data.Char main = do contents <- getContents putStr
$ map toUpper contents Q DBQTMPDLFSIBJLVUYU ·ͩจࣈྻ ͍Βͳ͍ΑͶ ࠷ऴతʹจࣈྻʹධՁ͞ΕΔϓϩϛε ϝϞϦ 129݄9༵
Ԇ*0 import Data.Char main = do contents <- getContents putStr
$ map toUpper contents Q DBQTMPDLFSIBJLVUYU ·ͩ·ͩɺ ಡΈࠐ·ͳ͍Α ೖྗͷ݁ՌʹUP6QQFSΛϚοϓ͢Δϓϩϛε ϝϞϦ 129݄9༵
Ԇ*0 import Data.Char main = do contents <- getContents putStr
$ map toUpper contents Q DBQTMPDLFSIBJLVUYU ͔Βͷ ೖྗͷঢ়گʁ ϝϞϦ ೖྗͷ݁ՌʹUP6QQFSΛϚοϓ͢Δϓϩϛε ϝϞϦ େจࣈԽ͞Εͨ ߦ͕ඞཁͩΑʂ 129݄9༵
Ԇ*0 import Data.Char main = do contents <- getContents putStr
$ map toUpper contents Q DBQTMPDLFSIBJLVUYU ϝϞϦ I'm a lil' teapot What's with that airplane food, huh? It's so small, tasteless [EOF] IBJLVUYU 129݄9༵
JOUFSBDU JOUFSBDU 4USJOH4USJOH *0 main = do contents <- getContents
putStr (shortLinesOnly contents) shortLinesOnly :: String -> String shortLinesOnly = unlines . filter (\line -> length line < 10) . lines ೖྗΛจࣈྻͱͯ͠ड͚औΔ ड͚औͬͨจࣈྻΛؔͰม͢Δ ݁ՌΛग़ྗ͢Δ ͱ͍͏Α͋͘ΔύλʔϯΛ؆୯ʹࡁ·ͤΔ Q 129݄9༵
JOUFSBDU JOUFSBDU 4USJOH4USJOH *0 main = interact shortLinesOnly shortLinesOnly ::
String -> String shortLinesOnly = unlines . filter (\line -> length line < 10) . lines ೖྗΛจࣈྻͱͯ͠ड͚औΔ ड͚औͬͨจࣈྻΛؔͰม͢Δ ݁ՌΛग़ྗ͢Δ ͱ͍͏Α͋͘ΔύλʔϯΛ؆୯ʹࡁ·ͤΔ Q 129݄9༵
ϑΝΠϧͱετϦʔϜ w)BTLFMMͰετϦʔϜσʔλΛ ؆୯ʹѻ͏ํ๏ wԆ*0ͷಈ࡞ ͋Δೖྗʹରͯ͠ͲΜͳग़ྗ͕ߟ͑ΒΕΔ͔ͱ͍͏ ࢹ͔Βߟ͑ͯɺͦͷมΛ͢ΔؔΛॻ͘ 129݄9༵
ϑΝΠϧͷಡΈॻ͖ w ϑΝΠϧΛ։͖ɺϋϯυϧΛ֫ಘͯ͠ ϑΝΠϧʹରͯ͠Կ͔Λߦ͏ PQFO'JMF XJUI'JMF I(FU$POUFOUT
SFBE'JMF XSJUF'JMF BQQFOE'JMF w Ұ࣌ϑΝΠϧΛ͏ PQFO5FNQ'JMF SFNPWF'JMF SFOBNF'JMF w ࣦഊͯ͠ϑΝΠϧΛด͡Δ CSBDLFU CSBDLFU0O&SSPS 129݄9༵
PQFO'JMF PQFO'JMF'JMF1BUI*0.PEF*0)BOEMF import System.IO main = do handle <- openFile
“baabaa.txt” ReadMode contents <- hGetContents handle putStr contents hClose handle w 'JMF1BUIɹ4USJOHͷܕγϊχϜ w *0.PEF 3FBE.PEF 8SJUF.PEF "QQFOE.PEF 3FBE8SJUF.PEF Q 129݄9༵
XJUI'JMF XJUI'JMF'JMF1BUI*0.PEF )BOEMF*0B *0B import System.IO main = do
withFile “baabaa.txt” ReadMode $ \handle -> do contents <- hGetContents handle putStr contents 'JMF1BUIͱ*0.PEF͔Β)BOEMFΛಘΔ )BOEMFΛؔʹ͢ ϑΝΠϧϋϯυϧΛด͡Δ ͕ؔฦͨ͠*0ΞΫγϣϯΛฦ͢ Q 129݄9༵
XJUI'JMF XJUI'JMF'JMF1BUI*0.PEF )BOEMF*0B *0B import System.IO main = do
withFile “baabaa.txt” ReadMode $ \handle -> do contents <- hGetContents handle putStr contents 'JMF1BUIͱ*0.PEF͔Β)BOEMFΛಘΔ )BOEMFΛؔʹ͢ ϑΝΠϧϋϯυϧΛด͡Δ ͕ؔฦͨ͠*0ΞΫγϣϯΛฦ͢ Q ࣦഊͨ͠ ߹ʂ 129݄9༵
ϒϥέοτ ԿΒ͔ͷϦιʔεΛ֫ಘ͢Δ ֫ಘͨ͠Ϧιʔεʹରͯؔ͠Λద༻͢Δ ϦιʔεΛղ์͢Δʢ࣮֬ʹʂʣ ͕ؔฦͨ͠*0ΞΫγϣϯΛฦ͢ CSBDLFU*0B
B*0C B*0D *0D withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a withFile name mode f = bracket (openFile name mode) (\handle -> hClose handle) (\handle -> f handle) Q 129݄9༵
ϒϥέοτ ԿΒ͔ͷϦιʔεΛ֫ಘ͢Δ ֫ಘͨ͠Ϧιʔεʹରͯؔ͠Λద༻͢Δ ϦιʔεΛղ์͢Δʢ࣮֬ʹʂʣ ͕ؔฦͨ͠*0ΞΫγϣϯΛฦ͢ CSBDLFU*0B
B*0C B*0D *0D withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a withFile name mode f = bracket (openFile name mode) (\handle -> hClose handle) (\handle -> f handle) Q 129݄9༵
ϒϥέοτ ԿΒ͔ͷϦιʔεΛ֫ಘ͢Δ ֫ಘͨ͠Ϧιʔεʹରͯؔ͠Λద༻͢Δ ϦιʔεΛղ์͢Δʢ࣮֬ʹʂʣ ͕ؔฦͨ͠*0ΞΫγϣϯΛฦ͢ CSBDLFU*0B
B*0C B*0D *0D withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a withFile name mode f = bracket (openFile name mode) (\handle -> hClose handle) (\handle -> f handle) Q 129݄9༵
ϒϥέοτ ԿΒ͔ͷϦιʔεΛ֫ಘ͢Δ ֫ಘͨ͠Ϧιʔεʹରͯؔ͠Λద༻͢Δ ϦιʔεΛղ์͢Δʢ࣮֬ʹʂʣ ͕ؔฦͨ͠*0ΞΫγϣϯΛฦ͢ CSBDLFU*0B
B*0C B*0D *0D withFile :: FilePath -> IOMode -> (Handle -> IO a) -> IO a withFile name mode f = bracket (openFile name mode) (\handle -> hClose handle) (\handle -> f handle) Q 129݄9༵
ϋϯυϧΛѲΕʂ w I(FU$POUFOUTϑΝΠϧͷ ϋϯυϧʹରͯ͠ಈ࡞͢ΔHFU$POUFOUT I(FU-JOF I1VU4US I1VU4US-O I(FU$IBS w
ϑΝΠϧΛಡΈࠐΈɺ ͦͷίϯςϯπΛจࣈྻͱͯ͠ѻ͏ SFBE'JMF XSJUF'JMF BQQFOE'JMF 129݄9༵
SFBE'JMF SFBE'JMF'JMF1BUI*04USJOH import System.IO main = do contents <- readFile
“baabaa.txt” putStr contents ϑΝΠϧύεΛड͚औΔ ͦͷϑΝΠϧΛಡࠐΉ ͦͷ༰Λද͢จࣈྻΛฦ͢ *0ΞΫγϣϯΛฦ͢ Q 129݄9༵
XSJUF'JMF ϑΝΠϧύεͱɺ ͦͷϑΝΠϧʹॻ͖ࠐΈ͍ͨจࣈྻΛड͚औΔ ͦͷॻ͖ࠐΈΛߦ͏*0ΞΫγϣϯΛฦ͢ XSJUF'JMF'JMF1BUI4USJOH*0 import System.IO import
Data.Char main = do contents <- readFile “baabaa.txt” writeFile “baabaacaps.txt” (map toUpper contents) Q ˞ࢦఆ͞ΕͨϑΝΠϧ͕͢Ͱʹଘࡏ͢Δ߹ɺ্ॻ͖͢Δ 129݄9༵
BQQFOE'JMF ϑΝΠϧύεͱɺ ͦͷϑΝΠϧʹॻ͖ࠐΈ͍ͨจࣈྻΛड͚औΔ ͦͷॻ͖ࠐΈΛߦ͏*0ΞΫγϣϯΛฦ͢ BQQFOE'JMF'JMF1BUI4USJOH*0 import System.IO main
= do todoItem <- getLine appendFile “todo.txt” (todoItem ++ “\n”) Q ˞ࢦఆ͞ΕͨϑΝΠϧ͕͢Ͱʹଘࡏ͢Δ߹ɺඌʹه͢Δ 129݄9༵
PQFO'JMF XJUI'JMF SFBE'JMF XSJUF'JMF BQQFOE'JMF ϑΝΠϧૢ࡞ͷؔ·ͱΊ ࣗ༝͕ߴ͍ ࣗͰॻ͘෦͕গͳ͍ ϑΝΠϧΛ։͍ͯ ϋϯυϧΛಘΔ
ϋϯυϧΛͬͯ ϑΝΠϧͷதΛ จࣈྻͱͯ͠औΓग़͢ ϑΝΠϧΛด͡Δ औΓग़ͨ͠จࣈྻʹ ର͢Δૢ࡞ 129݄9༵
PQFO'JMF XJUI'JMF SFBE'JMF XSJUF'JMF BQQFOE'JMF ϑΝΠϧૢ࡞ͷؔ·ͱΊ ࣗ༝͕ߴ͍ ࣗͰॻ͘෦͕গͳ͍ ϑΝΠϧΛ։͍ͯ ϋϯυϧΛಘΔ
ϋϯυϧΛͬͯ ϑΝΠϧͷதΛ จࣈྻͱͯ͠औΓग़͢ ϑΝΠϧΛด͡Δ औΓग़ͨ͠จࣈྻʹ ର͢Δૢ࡞ 129݄9༵
PQFO'JMF XJUI'JMF SFBE'JMF XSJUF'JMF BQQFOE'JMF ϑΝΠϧૢ࡞ͷؔ·ͱΊ ࣗ༝͕ߴ͍ ࣗͰॻ͘෦͕গͳ͍ ϑΝΠϧΛ։͍ͯ ϋϯυϧΛಘΔ
ϋϯυϧΛͬͯ ϑΝΠϧͷதΛ จࣈྻͱͯ͠औΓग़͢ ϑΝΠϧΛด͡Δ औΓग़ͨ͠จࣈྻʹ ର͢Δૢ࡞ 129݄9༵
PQFO'JMF XJUI'JMF SFBE'JMF XSJUF'JMF BQQFOE'JMF ϑΝΠϧૢ࡞ͷؔ·ͱΊ ࣗ༝͕ߴ͍ ࣗͰॻ͘෦͕গͳ͍ ϑΝΠϧΛ։͍ͯ ϋϯυϧΛಘΔ
ϋϯυϧΛͬͯ ϑΝΠϧͷதΛ จࣈྻͱͯ͠औΓग़͢ ϑΝΠϧΛด͡Δ औΓग़ͨ͠จࣈྻʹ ର͢Δૢ࡞ 129݄9༵
UFNQϑΝΠϧΛ͏ (tempName, tempHandle) <- openTempFile “.” “temp” hPutStr tempHandle newTodoItems
hClose tempHandle removeFile “todo.txt” renameFile tempName “todo.txt” QɹҰ෦ൈਮ ϑΝΠϧͷதΛॻ͖͑Δ Ұ࣌ϑΝΠϧʹ৽͍͠༰Λॻ͖ࠐΈɺ ݩͷϑΝΠϧͱஔ͖͑Δ PQFO5FNQ'JMF 4ZTUFN*0 SFNPWF'JMF SFOBNF'JMF 4ZTUFN%JSFDUPSZ 129݄9༵
UFNQϑΝΠϧΛ͏ (tempName, tempHandle) <- openTempFile “.” “temp” hPutStr tempHandle newTodoItems
hClose tempHandle removeFile “todo.txt” renameFile tempName “todo.txt” QɹҰ෦ൈਮ ϑΝΠϧͷதΛॻ͖͑Δ Ұ࣌ϑΝΠϧʹ৽͍͠༰Λॻ͖ࠐΈɺ ݩͷϑΝΠϧͱஔ͖͑Δ PQFO5FNQ'JMF 4ZTUFN*0 SFNPWF'JMF SFOBNF'JMF 4ZTUFN%JSFDUPSZ ϓϩάϥϜͷҟৗऴྃͰɺҰ࣌ϑΝΠϧ͕ͬͯ͠·͏ 129݄9༵
ΫϦʔϯΞοϓ CSBDLFU0O&SSPS*0B B*0C B*0D *0D ͕ىͬͨ͜߹ͰҰ࣌ϑΝΠϧ͕ ࣮֬ʹআ͞ΕΔ bracketOnError (openTempFile
“.” “temp”) (\(tempName, tempHandle) -> do hClose tempHandle removeFile tempName) (\(tempName, tempHandle) -> do hPutStr tempHandle newTodoItems hClose tempHandle removeFile “todo.txt” renameFile tempName “todo.txt”) QɹҰ෦ൈਮ 129݄9༵
ΫϦʔϯΞοϓ CSBDLFU0O&SSPS*0B B*0C B*0D *0D ͕ىͬͨ͜߹ͰҰ࣌ϑΝΠϧ͕ ࣮֬ʹআ͞ΕΔ bracketOnError (openTempFile
“.” “temp”) (\(tempName, tempHandle) -> do hClose tempHandle removeFile tempName) (\(tempName, tempHandle) -> do hPutStr tempHandle newTodoItems hClose tempHandle removeFile “todo.txt” renameFile tempName “todo.txt”) QɹҰ෦ൈਮ Τϥʔ͕ൃੜͨ͠ ߹ʹ͖͢͜ͱ 129݄9༵
ίϚϯυϥΠϯҾ ϢʔβͷࢦࣔΛϓϩάϥϜʹ͑Δ ࠷ળͷํ๏ import System.Environment import Data.List main = do
args <- getArgs progName <- getProgName putStrLn “The arguments are:” mapM putStrLn args putStrLn “The program name is” putStrLn progName Q 129݄9༵
EJTQBUDIؔ dispatch :: String -> [String] -> IO () dispatch
“add” = add dispatch “view” = view dispatch “remove” = remove main = do (command:argList) <- getArgs dispatch command argList add :: [String] -> IO () add [fileName, todoItem] = appendFile fileName (todoItem ++ “\n”) QɹҰ෦ൈਮ w ϓϩάϥϜʹෳͷػೳΛ࣋ͨͤΔ w ؆୯ʹػೳΛՃͰ͖Δ EJTQBUDI͔ؔΒదͳؔΛड͚औΓɺ ͦͷؔʹҾΛͯ͠*0ΞΫγϣϯΛಘΔ 129݄9༵
ෆਖ਼ͳೖྗʹରԠ͢Δ dispatch :: String -> [String] -> IO () dispatch
“add” = add dispatch “view” = view dispatch “remove” = remove dispatch command = doesntExist command doesntExist :: String -> [String] -> IO () doesntExist command _ = putStrLn $ “The “ ++ command ++ “command doesn’t exist” main = do (command:argList) <- getArgs dispatch command argList add :: [String] -> IO () add [fileName, todoItem] = appendFile fileName (todoItem ++ “\n”) add _ = putStrLn “The add command takes exactly two arguments” Q 129݄9༵
ϥϯμϜੑ w७ਮͳ)BTLFMMཚ͕ۤखʁ wϥϯμϜੑ*0Ͱ֎͔Β࣋ͬͯ͘Δ SBOEPN 3BOEPN(FOH 3BOEPNB H B H 4ZTUFN3BOEPNϞδϡʔϧ
SBOEPNT 3BOEPN(FOH 3BOEPNB H<B> SBOEPN3 3BOEPN(FOH 3BOEPNB B B H B H SBOEPN3T 3BOEPN(FOH 3BOEPNB B B H<B> 129݄9༵
ϥϯμϜੑͱ*0HFU4UE(FO import System.Random main = do gen <- getStdGen putStrLn
$ take 20 (randomRs (‘a’, ‘z’) gen) Q ࣮ߦ͢Δͨͼʹҧ͏݁Ռ͕ಘΒΕΔ import System.Random main = do gen <- getStdGen putStrLn $ take 20 (randomRs (‘a’, ‘z’) gen) gen2 <- getStdGen putStrLn $ take 20 (randomRs (‘a’, ‘z’) gen2) Q ಉ͡จࣈྻ͕ճදࣔ͞ΕΔ 129݄9༵
ϥϯμϜੑͱ*0OFX4UE(FO import System.Random main = do gen <- getStdGen putStrLn
$ take 20 (randomRs (‘a’, ‘z’) gen) gen' <- newStdGen gen2 <- getStdGen putStrLn $ take 20 (randomRs (‘a’, ‘z’) gen') putStrLn $ take 20 (randomRs (‘a’, ‘z’) gen2) Qվ w ݱࡏͷཚδΣωϨʔλΛͭͷδΣωϨʔλʹׂ ৽͍͠ཚδΣωϨʔλ͕ಘΒΕΔ άϩʔόϧδΣωϨʔλ͕ߋ৽͞ΕΔ 129݄9༵
CZUFTUSJOH w4USJOHΑΓޮྑ͘จࣈྻΛѻ͏ wਖ਼֨CZUFTUSJOHͱԆCZUFTUSJOH %BUB#ZUF4USJOH %BUB#ZUF4USJOH-B[Z wCZUFTUSJOHϞδϡʔϧͷؔ %BUB-JTUͷؔͱΑ͘ࣅͨؔ
4ZTUFN*0ͷؔͱಉ༷ͷؔ ·ͣී௨ͷจࣈྻͰॻ͍ͯΈͯɺ ύϑΥʔϚϯεʹຬͰ͖ͳ͚ΕCZUFTUSJOHͰॻ͖͑Δ 129݄9༵
ͬͱೖྗɺͬͱग़ྗ wϑΝΠϧ wίϚϯυϥΠϯҾ wཚ wCZUFTUSJOH 129݄9༵