Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Haskell入門ハンズオン
Search
Aruneko
July 07, 2018
Programming
1
1.4k
Haskell入門ハンズオン
オープンソースカンファレンス2018 Hokkaido (#osc18do) で発表したHaksell入門に関するハンズオンの資料です
Aruneko
July 07, 2018
Tweet
Share
More Decks by Aruneko
See All by Aruneko
RedmineをDockerに載せてみた
aruneko
1
2.3k
NFCとしゃべってみよう
aruneko
0
120
北海道における学生ITコミュニティの紹介
aruneko
0
140
ゼロからわかるポインター
aruneko
0
970
ゆるいPython会
aruneko
0
230
Dockerでドカドカ on FuraIT #36
aruneko
1
750
Other Decks in Programming
See All in Programming
Pythonで改めて考える「クラス(class)」の使いどころ
os1ma
3
790
長期運用プロダクトの開発速度を維持し続けるためのリファクタリング実践例
wataruss
8
2.7k
Hono・Prisma・AWSでGeoなAPI開発
nokonoko1203
5
680
Jakarta EE meets AI
ivargrimstad
0
390
Rubyとクリエイティブコーディングの輪の広がり / The Growing Circle of Ruby and Creative Coding
chobishiba
1
270
私のEbitengineの第一歩
qt_luigi
0
450
Amazon Neptuneで始める初めてのグラフDB ー グラフDBを使う意味を考える ー
satoshi256kbyte
2
260
状態管理ライブラリZustandの導入から運用まで
k1tikurisu
3
470
Lessons by WebAssembly app in production on CDN Edge Computing Service
tetsuharuohzeki
0
210
LangChainの現在とv0.3にむけて
os1ma
4
930
Rubyのobject_id
qnighy
6
1.3k
エラーレスポンス設計から考える、0→1開発におけるGraphQLへの向き合い方
bicstone
5
1.5k
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
225
22k
A better future with KSS
kneath
235
17k
Thoughts on Productivity
jonyablonski
66
4.2k
Atom: Resistance is Futile
akmur
261
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
36
6.8k
Documentation Writing (for coders)
carmenintech
65
4.3k
Being A Developer After 40
akosma
84
590k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.3k
How To Stay Up To Date on Web Technology
chriscoyier
786
250k
Why You Should Never Use an ORM
jnunemaker
PRO
53
8.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Making Projects Easy
brettharned
113
5.8k
Transcript
)BTLFMMೖϋϯζΦϯ ʙ3&1-Ͱ࢝ΊΔ)BTLFMMੜ׆ʙ "SVOFLP!)BTLFMMKQ
ࣗݾհ w !BSVOFLP w Ұൠࣾஂ๏ਓ-0$"-ֶੜ෦ w ߴߍੜ͙Β͍ͷ࣌ʹ)BTLFMMʹग़ձͬͯ͠·ͬͨ w )BTLFMMKQͷ4MBDLʹજ෬த
)BTLFMMKQͷ͝հ w ຊ)BTLFMMϢʔβʔάϧʔϓ w ຊʹ͓͚Δ)BTLFMMͷීٴ׆ಈͱར༻ऀͷαϙʔτΛ࣮ࢪ w 4MBDL͋ΔͷͰͥͻ͝ࢀՃ͍ͩ͘͞ʂʂ
શମͷྲྀΕ
ඪ w ԿΒ͔ͷݴޠΛͬͨ͜ͱ͕͋Δਓ͕ w ͪΐͬͱ͚ͩͰ)BTLFMMʹ͠ΈΛ࣋ͯΔΑ͏ʹͳΔʂ
ຊͷϝχϡʔ )BTLFMMͷઆ໌ ڥߏஙʹ͍ͭͯ 3&1-Ͱ༡Ϳ ࿅श৭ʑ
ࢀߟจݙ w ͍͢͝)BTLFMMͨͷֶ͘͠΅͏ w .JSBO-JQPWB㶜Bஶ w ాதӳߦ༁ w ଜओਸߦ༁ w
)BTLFMMͷΤοηϯε͕٧·ͬͨຊͰ͢ʂ
)BTLFMMͬͯͲΜͳݴޠʁ
)BTLFMMͬͯͲΜͳݴޠʁ w ʮ७ਮؔܕϓϩάϥϛϯάݴޠʯ w ७ਮ w ࡞༻ͱ෭࡞༻͕͞Ε͍ͯΔঢ়ଶ w ࢀরಁաੑ͕อূ͞Ε͓ͯΓɺಉ͡ҾΛ༩͍͑ͨؔͭݺΜͰಉ݁͡Ռ Λฦ͢
w ؔܕϓϩάϥϛϯά w ϓϩάϥϜશମΛؔͷΈ߹ΘͤͰهड़͢ΔϓϩάϥϛϯάελΠϧͷ͜ͱ
)BTLFMMͬͯͲΜͳݴޠʁ w σϑΥϧτͰԆධՁ w ͕ਅʹඞཁʹͳΔ·ͰධՁ͞Εͳ͍ w ߹ʹΑͬͯϝϦοτͰɺ߹ʹΑͬͯσϝϦοτ w ڧ͍੩తܕ͚ w
͍͍ͨͯͷ߹ܕਪͷ͓͔͛ͰܕΛ໌ࣔ͢Δඞཁແ͍ w Ͱॻ͘ͱ͖ܕΛҙࣝͭͭ͠ॻ͘ͱॻ͖͍͢ w ॲཧͷࣦഊ*0ͳͲܕͰද͢
ڥߏங
4UBDLΛ͏ w )BTLFMMڥʮ4UBDLʯΛͬͯߏங w +BWBͷ.BWFO4DBMBͷTCUʹ͋ͨΔϏϧυπʔϧ w )BTLFMMίϯύΠϥͷσϑΝΫτελϯμʔυͰ͋Δ ()$ͷ҆ఆ൛͕Πϯετʔϧ͞ΕΔ w ϓϩδΣΫτ͝ͱʹύοέʔδͷཧ͕Մೳ
w ͨͩ͠()$ͷ༰ྔ͕େ͖͍ͷͰɺࠓճհ͚ͩ
4UBDLͷΠϯετʔϧ w 6OJYܥ04Ͱ͋ΕɺΠϯετʔϧҎԼͷίϚϯυҰൃͰऴྃ w ৄࡉެࣜαΠτΛ͝ཡ͍ͩ͘͞ w IUUQTEPDTIBTLFMMTUBDLPSHFOTUBCMF3&"%.& $ curl -sSL
https://get.haskellstack.org/ | sh
4UBDLΛ͏ w ॳճ·ͣΞοϓσʔτΛ͠ɺ4UBDLBHF͔Β࠷৽ͷ-54Λऔಘ w 4UBDLBHF)BTLFMMύοέʔδͷ҆ఆ൛όʔδϣϯΛूΊͨϦϙδτϦ w Ξοϓσʔτ͕Ͱ͖ͨΒ3&1- ()$J Λىಈ $
stack update $ stack ghci
ΦϯϥΠϯ3&1- w ࠓճ4UBDL ()$JͷΘΓʹΦϯϥΠϯ3&1-ͷSFQMJUΛར༻ w IUUQTSFQMJUMBOHVBHFTIBTLFMM w ը໘ࠨ͕ΤσΟλɺӈ͕()$J
()$JͰ༡Ϳ
͜ͷηΫγϣϯͰΔ͜ͱ w ()$Jʹ؆୯ͳࣜΛଧͪࠐΜͰిΘΓʹ͑ΔΑ͏ʹͳΔ w #PPMԋࢉ͕Ͱ͖Δ
()$JͰి w Α͋͘Δதஔԋࢉࢠ͕ར༻Մೳ w w )BTLFMMతʹதஔؔͱݺͼ·͢
w ΧοίͳͲͦͷ·· w ͨͩ͠ϚΠφεͷׅހΛ͚ͯ໌ࣔ w ಛఆͷ݅ͰύʔεΤϥʔʹͳΓ·͢ > 1 + 1 2 > (2 + 4) / 2 3.0 > 2 * 10 / 5 4.0 > 10 - 100 -90 > -10 + 20 10 > 20 - (-10) 30 > 20 - -10 Precedence parsing error
()$JͰ#PPMԋࢉ w ଞͷݴޠͱ͍͍ͩͨҰॹ w ൱ఆ͚ͩҙʂʂ > 'a' == 'a' True
> 1 /= 1 False > True && False False > False || True True > not True False
͜͜·Ͱͷ·ͱΊ w ଞͷݴޠͱ΄΅มΘΒͳ͍࢛ଇԋࢉ͕Մೳ w #PPMԋࢉ΄΅ಉ༷͚ͩͲɺ൱ఆͷܗʹҙ
ؔΛ͏ɾ࡞Δ
͜ͷηΫγϣϯͰΔ͜ͱ w )BTLFMMಛ༗ͷؔݺͼग़͠ΛֶͿ w தஔؔͱલஔؔͷมΛֶͿ w ݁߹ॱংΛֶͿ
ؔͷݺͼํ w ҾΛεϖʔε۠ΓͰࢦఆ͢Δ͚ͩ w Ҿؔͷ߹όοΫΫΥʔτͰғΜͰதஔܗࣜʹͰ͖Δ w ٯʹதஔׅؔހͰғΉͱҾؔԽͰ͖Δ > mod
10 3 1 > 10 `mod` 3 1 > (+) 1 2 3
ؔͷݺͼํ w ݁߹ॱংؔద༻͕࠷ڧͳͷͰదٓΧοίΛ͏ w ͔ͦ͜ΒޙΖશ෦ΛׅހʹೖΕ͍ͨ߹ʮʯ͕ศར > sin (pi /
2) 1.0 > sin $ pi / 2 1.0
ܭࢉ݁Ռͷอଘ w ()$JͰɺΠίʔϧΛͬͯదͳมʹΛଋറ͢Δ͜ͱ͕Մೳ w ()$J͡Όͳ͍ͱ͜ΖͰͪΐͬͱҧ͏ͷͰҙ > hoge = 1 >
hoge 1 > fuga = sin $ pi / 2 > fuga 1.0
ؔΛ࡞Δ w ҾΛεϖʔε۠ΓͰॻ͍ͯ͋͛Ε0, w )BTLFMMࣜࢦͰͲΜͳؔৗʹΛฦ͢ͷͰSFUVSOෆཁ w ෆཁͱ͍͏͔ͦͦSFUVSOΛॻ͚ͳ͍ w ࡾฏํͷఆཧΛॻ͍ͯΈΔ >
calcDistance x1 y1 x2 y2 = sqrt $ (x1 - x2) ^ 2 + (y1 - y2) ^ 2 > calcDistance 0 0 1 1 1.4142135623730951 > calcDistance 0 0 1 (sqrt 3) 1.9999999999999998 a2 + b2 = c2
͜͜·Ͱͷ·ͱΊ w ؔݺͼग़͠ҾΛεϖʔε۠ΓͰ w Χοί ͱAόοΫΫΥʔτAͰલஔͱதஔʹม w ݁߹ॱং͕ؔ࠷ڧ w దٓΧοίΛͬͯ༏ઌॱҐΛ੍ޚ
w ؔఆٛҾΛεϖʔε۠ΓͰ w ͨͩ͠SFUVSO͍Βͳ͍
ϦετͰ༡Ϳ
͜ͷηΫγϣϯͰΔ͜ͱ w Ϧετͷఆٛํ๏ w ϨϯδΛͬͨϦετͷҰׅੜ w Ϧετͷܨ͗ํ w Ϧετૢ࡞ؔ w
ແݶϦετ
ϦετΛ࡞Δ w Α͘ݟΔײ͡ͷϦςϥϧͰॻ͚Δ w ൣғ Ϩϯδ ੜՄೳ ॱ൪͕͋ΔͷͳΒԿͰ0, w
ॳظͱ൪ͷΛΧϯϚ۠ΓͰॻ͚ࠩྻ0, > l = [1, 3, 5, 7, 9] > l [1,3,5,7,9] > [1..10] [1,2,3,4,5,6,7,8,9,10] > ['a'..'g'] "abcdefg" > [1,4..20] [1,4,7,10,13,16,19]
ϦετΛܨ͙ w ϦετͱϦετΛܨ͙ʹ Λ͏ w ୯ํϦετͷͨΊڊେϦετʹܨ͝͏ͱ͢Δͱஶ͍͘͠ͷͰҙ w ઌ಄ʹ͚͍ͭͨ͠ͱ͖ίϩϯΛ͏ w ඌʹ͚ͤͳ͍ͷͰҙ
Prelude> [1..5] ++ [4..10] [1,2,3,4,5,4,5,6,7,8,9,10] Prelude> 5:[6..10] [5,6,7,8,9,10]
Ϧετૢ࡞ؔ w ઌ಄ΛऔΓग़͢ w ઌ಄Ҏ֎ΛऔΓग़͢ w ඌҎ֎ΛऔΓग़͢ w ඌΛऔΓग़͢ >
head [1..5] 1 > tail [1..5] [2,3,4,5] > init [1..5] [1,2,3,4] > last [1..5] 5
ແݶϦετ w )BTLFMMσϑΥϧτͰԆධՁͳͷͰແݶϦετ͕࡞Մೳ w ϨϯδͷඌΛল͘ͱແݶϦετʹͳΔ w దʹʮ$USM $ʯͰࢭΊ͍ͯͩ͘͞ w Ͳ͔͜ͰධՁ͕Ұҙʹఆ·ΔΑ͏ͳؔͱΈ߹ΘͤΔ͜ͱՄೳ
> [1..] [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,…… > head [1..] 1
͜͜·Ͱͷ·ͱΊ w ͋Γ͕ͪͳํ๏ͰϦετΛఆٛՄೳ w ϨϯδͰϦετΛҰׅੜ w Ϧετಉ࢜ Ͱɺઌ಄ʹ͚ͭͩͳΒͰܨ͙ w Ϧετૢ࡞ؔΛศརʹͬͯΛऔΓग़͢
w ϨϯδແݶϦετੜՄೳ
ܕͱΊ͙Δ)BTLFMMੈք
͜ͷηΫγϣϯͰΔ͜ͱ w ܕͷௐํ w ܕͷදهํ๏ w ܕม w தஔؔͷܕ w
ܕΫϥε
ܕΛௐΔ w )BTLFMMͱʹ͔͘ܕΛҙࣝ͢Δͱॻ͖͍͢ w ()$JͰܕΛௐΔʹʮUʯίϚϯυΛར༻ > :t 'a' 'a' ::
Char > :t False False :: Bool
ܕͷදهͱม w )BTLFMMͰԾҾ໊ͱܕผʑʹఆٛ w ܕఆٛҾͷܕͱฦΓͷܕΛಛʹ۠ผͤͣͰ۠ͬͯఆٛ w IFBEUBJMͷܕΛௐΔͱग़ͯ͘ΔzBz͕ܕม w ҾͱฦΓͰܕಉ͡Ͱ͋ͬͯཉ͍͚͠ͲͲΜͳܕͰ0, >
:t head head :: [a] -> a > :t tail tail :: [a] -> [a]
தஔؔͷܕΛௐΔ w தஔؔͷܕΛௐΔͱ͖ΧοίͰ͘͘Δ w ͠ࢉͷྫ w ͜ͷԿͩΖ͏ʁ > :t (+)
(+) :: Num a => a -> a -> a
ܕΫϥεͱܕม w /VNશൠΛද͢ܕΫϥε w ܕΛྨ͢ΔͨΊͷΈ w /VNBʮB/VNͷΠϯελϯεʯͱ͍͏੍Λҙຯ͢Δ w ٯʹݴ͏ͱʮB/VNͳΒͳΜͰ͍͍ʯͱղऍՄೳ w
/VNͷΠϯελϯεͱͯ͠*OU%PVCMF͕ఆٛ͞Ε͍ͯΔ (+) :: Num a => a -> a -> a
͜͜·Ͱͷ·ͱΊ w UίϚϯυͰܕ͕ௐΒΕΔ w ԾҾͱܕผʑʹఆٛ w ͰԾҾͷܕͱฦΓͷܕΛ۠ͬͯॻ͘ w ܕมΛͬͯ͏·͘நԽ w
தஔؔͷܕΛௐΔͱ͖ Χοί Λ͏ w ܕΛ·ͱΊΔͨΊʹܕΫϥε͕͑Δ
ؔͷਂ۷Γ
͜ͷηΫγϣϯͰΔ͜ͱ w ΧϦʔԽ w ߴ֊ؔ w ߹ؔ
ؔͷΧϦʔԽ w )BTLFMMͷؔσϑΥϧτͰΧϦʔԽ͞ΕΔ w ҾΛऔͬͯʮΓͷҾΛऔͬͯฦΓΛฦؔ͢ʯΛฦ͢ w ؔͷ෦ద༻͕ՄೳʹͳΔ > :t gcd
gcd :: Integral a => a -> a -> a > gcdOfFiveAnd = gcd 5 > :t gcdOfFiveAnd gcdOfFiveAnd :: Integral a => a -> a > gcdOfFiveAnd 13 1
ߴ֊ؔ w ؔΛҾʹऔΔؔΛߴ֊ؔͱݺͿ w ҾʹؔΛ͢ͱ͖ϥϜμࣜΛ͏ w ͰΧϦʔԽ͞ΕΔ͜ͱΛࢥ͍ग़͢ͱͬͱศར > :t map
map :: (a -> b) -> [a] -> [b] > map (\x -> mod 10 x) [1, 2, 3] [0,0,1] > map (mod 10) [1, 2, 3] [0,0,1]
߹ؔ w ֶͷ࣌ؒʹͬͨ͋ͷҾؔͷ߹ؔʮʯͰදݱ w ଟҾؔ෦ద༻ͯ͠Ҿؔʹ͢Ε߹Մೳ g(f(x)) = (g ∘ f)(x)
> cos . sin $ pi 1.0 cos(sin(x)) = (cos ∘ sin)(x) > sum . map (+ 1) . filter (> 5) $ [3, 4, 5, 6, 7] 15
͜͜·Ͱͷ·ͱΊ w )BTLFMMͷؔσϑΥϧτͰΧϦʔԽ͞Ε͍ͯΔ w ؔΛҾʹऔΔ͕ؔߴ֊ؔ w lzͰ͕ؔ߹Մೳ
λϓϧͰ༡Ϳ
͜ͷηΫγϣϯͰΔ͜ͱ w λϓϧͱʁ w Ϧετ͔ΒλϓϧΛੜ w ϥϜμࣜͰλϓϧΛ͏ʹ
λϓϧͱʁ w λϓϧݻఆͷҙͷͷ w Ϧετ୯ҰܕͰ͔͠࡞Εͳ͍͕λϓϧෳͷܕ͔Β࡞Մೳ > (1, 2) > ("Hello",
5) > (1, 2.5, [1..3])
Ϧετ͔ΒλϓϧΛ࡞Δ w [JQͰͭͷϦετ͔Βཁૉͷλϓϧ͕࡞Մೳ w ͍͞ํʹ߹ΘͤΒΕΔ > zip [1..5] ['a'..'z'] [(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')]
ϥϜμࣜͰλϓϧΛड͚औΔ w λϓϧҾʹऔΔͱ͖ʹύλʔϯϚονͰղՄೳ w Ͱ͜ͷ߹[JQ8JUIͨ͠΄͏͕؆ܿ > map (\ (x, y)
-> x + y) $ zip [1..10] [1..10] [2,4,6,8,10,12,14,16,18,20] > zipWith (+) [1..10] [1..10] [2,4,6,8,10,12,14,16,18,20]
͜͜·Ͱͷ·ͱΊ w ෳͷͷ͕λϓϧ w [JQͰϦετ͔Βλϓϧ͕࡞ΕΔ w ϥϜμࣜͰλϓϧΛҾʹऔΔʹύλʔϯϚονΛ͏ w ߹ʹΑͬͯ[JQ8JUIͰָΛ͠Α͏
࿅श
࿅श w ͔Β·Ͱͷࣗવͷ͏ͪɺۮͷΛܭࢉ͠Α͏ w ώϯτʣ w ۮ͔Ͳ͏͔FWFOؔͰఆ w ʹͳΕਖ਼ղ
࿅श w ະຬͷͰɺ͔ͷഒʹͳ͍ͬͯΔͷ߹ܭΛٻΊΑ͏ w 1SPKFDU&VMFS1SPCMFNΑΓ w ͕ग़Εਖ਼ղ
࿅श w ࠷ॳͷݸͷࣗવʹ͓͚Δೋ w ࠷ॳͷݸͷࣗવʹ͓͚Δͷೋ w ͜ΕΒͷࠩ w ಉ༷ʹɺ࠷ॳͷݸͷࣗવʹ͓͚ΔೋͱͷೋͷࠩΛٻΊΑ͏
w 1SPKFDU&VMFS1SPCMFNΑΓ 12 + 22 + ⋯ + 102 = 385 (1 + 2 + ⋯ + 10)2 = 3025 3025 − 385 = 2640
͓ΘΓʹ
͓ΘΓʹ w ͪΐͬͱ͚ͩͰ)BTLFMMָ͠Ί·͔ͨ͠ʁ w ͬͱΓͨ͘ͳͬͨΒʮ͍͢͝)BTLFMMͨͷֶ͘͠΅͏ʯΛͥͻ w ͪΐͬͱهड़͕ݹ͍Օॴ͕͋ΔͷͰɺͪ͜ΒͷهࣄͲ͏ͧ w ʹʮ͍͢͝)BTLFMMͨͷֶ͘͠΅͏ʯΛಡΉ w
IUUQTHPPHMILK&$S