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
270
Dockerでドカドカ on FuraIT #36
aruneko
1
890
Other Decks in Programming
See All in Programming
概念モデル→論理モデルで気をつけていること
sunnyone
2
270
AIでLINEスタンプを作ってみた
eycjur
1
230
パッケージ設計の黒魔術/Kyoto.go#63
lufia
3
440
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
1.7k
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
160
2025 年のコーディングエージェントの現在地とエンジニアの仕事の変化について
azukiazusa1
24
12k
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
860
Swift Updates - Learn Languages 2025
koher
2
480
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
440
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
310
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
160
Ruby Parser progress report 2025
yui_knk
1
450
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1032
460k
A designer walks into a library…
pauljervisheath
207
24k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Building Applications with DynamoDB
mza
96
6.6k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Facilitating Awesome Meetings
lara
55
6.5k
Designing Experiences People Love
moore
142
24k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
For a Future-Friendly Web
brad_frost
180
9.9k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Navigating Team Friction
lara
189
15k
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