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.6k
Haskell入門ハンズオン
オープンソースカンファレンス2018 Hokkaido (#osc18do) で発表したHaksell入門に関するハンズオンの資料です
Aruneko
July 07, 2018
Tweet
Share
More Decks by Aruneko
See All by Aruneko
RedmineをDockerに載せてみた
aruneko
1
2.4k
NFCとしゃべってみよう
aruneko
0
170
北海道における学生ITコミュニティの紹介
aruneko
0
210
ゼロからわかるポインター
aruneko
0
980
ゆるいPython会
aruneko
0
260
Dockerでドカドカ on FuraIT #36
aruneko
1
890
Other Decks in Programming
See All in Programming
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
13
7.5k
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
470
パスタの技術
yusukebe
1
400
大規模FlutterプロジェクトのCI実行時間を約8割削減した話
teamlab
PRO
0
490
[FEConf 2025] 모노레포 절망편, 14개 레포로 부활하기까지 걸린 1년
mmmaxkim
0
990
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
180
Dart 参戦!!静的型付き言語界の隠れた実力者
kno3a87
0
210
私の後悔をAWS DMSで解決した話
hiramax
4
130
Infer入門
riru
4
1.6k
KessokuでDIでもgoroutineを活用する / Go Connect #6
mazrean
0
110
AIレビュアーをスケールさせるには / Scaling AI Reviewers
technuma
2
230
新世界の理解
koriym
0
140
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Designing for Performance
lara
610
69k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Agile that works and the tools we love
rasmusluckow
329
21k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Done Done
chrislema
185
16k
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