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.5k
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
150
ゼロからわかるポインター
aruneko
0
970
ゆるいPython会
aruneko
0
230
Dockerでドカドカ on FuraIT #36
aruneko
1
770
Other Decks in Programming
See All in Programming
3rd party scriptでもReactを使いたい! Preact + Reactのハイブリッド開発
righttouch
PRO
1
610
RubyLSPのマルチバイト文字対応
notfounds
0
120
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
630
Outline View in SwiftUI
1024jp
1
330
ふかぼれ!CSSセレクターモジュール / Fukabore! CSS Selectors Module
petamoriken
0
150
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.4k
受け取る人から提供する人になるということ
little_rubyist
0
250
ピラミッド、アイスクリームコーン、SMURF: 自動テストの最適バランスを求めて / Pyramid Ice-Cream-Cone and SMURF
twada
PRO
10
1.3k
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
300
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
300
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
690
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Raft: Consensus for Rubyists
vanstee
136
6.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Become a Pro
speakerdeck
PRO
25
5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
What's new in Ruby 2.0
geeforr
343
31k
Practical Orchestrator
shlominoach
186
10k
4 Signs Your Business is Dying
shpigford
180
21k
Site-Speed That Sticks
csswizardry
0
28
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