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
160
北海道における学生ITコミュニティの紹介
aruneko
0
200
ゼロからわかるポインター
aruneko
0
980
ゆるいPython会
aruneko
0
260
Dockerでドカドカ on FuraIT #36
aruneko
1
880
Other Decks in Programming
See All in Programming
XP, Testing and ninja testing
m_seki
2
130
GraphRAGの仕組みまるわかり
tosuri13
7
450
ASP.NETアプリケーションのモダナイズ インフラ編
tomokusaba
1
390
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
1
850
Create a website using Spatial Web
akkeylab
0
290
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
130
Go Modules: From Basics to Beyond / Go Modulesの基本とその先へ
kuro_kurorrr
0
120
すべてのコンテキストを、 ユーザー価値に変える
applism118
2
450
LINEヤフー データグループ紹介
lycorp_recruit_jp
0
760
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
200
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
130
A2A プロトコルを試してみる
azukiazusa1
2
870
Featured
See All Featured
A Tale of Four Properties
chriscoyier
160
23k
Into the Great Unknown - MozCon
thekraken
39
1.9k
Product Roadmaps are Hard
iamctodd
PRO
53
11k
Embracing the Ebb and Flow
colly
86
4.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
920
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
The Pragmatic Product Professional
lauravandoore
35
6.7k
It's Worth the Effort
3n
184
28k
Speed Design
sergeychernyshev
31
1k
RailsConf 2023
tenderlove
30
1.1k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
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