1ষ ং ܕͱܕਪ (3/5)
• PureScriptͷܕγεςϜɺܕਪ(type inference)Λαϙʔτ
• ܕਪʹɺ࠷ݶͷ໌ࣔతͳܕऍ͚͕ͩඞཁ
• ܕγεςϜɺհऀͰͳ͘ಓ۩
• ࣍ͷίʔυΛఆ͍ٛͯ͠Δ͕ɺ Numberܕͩͱ͍͏ऍͳ͍
iAmANumber =
let square x = x * x
in square 42.0
8
Slide 9
Slide 9 text
1ষ ং ܕͱܕਪ (4/5)
• ࣍ͷྫͰɺίϯύΠϥʹͱͬͯະͷܕ͕ଘࡏ͠ɺܕऍͳ͠
Ͱܕͷਖ਼͠͞Λ͔֬ΊΔ͜ͱ͕Ͱ͖Δ
iterate f 0 x = x
iterate f n x = iterate f (n - 1) (f x)
• ͜͜Ͱxͷܕෆ໌͕ͩɺx͕ͲΜͳܕΛ͍࣋ͬͯΔ͔ʹ͔͔ΘΒ
ͣɺiterate͕ܕγεςϜͷنଇʹै͍ͬͯΔ͜ͱΛίϯύΠϥ
ݕূ͢Δ
9
2ষ ͡Ίʹ ରࣜॲཧܥΛ༻ͨ͠ίʔυͷςετ (2/4)
• ίϚϯυͷҰཡΛݟΔʹɺ :?Λೖྗ
> :?
The following commands are available:
:? Show this help menu
:quit Quit PSCi
:reset Reset
:browse Browse
:type Show the type of
:kind Show the kind of
:show import Show imported modules
:show loaded Show loaded modules
:paste paste Enter multiple lines, terminated by
^D
• TabΩʔΛԡ͢ͱɺࣗͷίʔυͰར༻Մೳͳͯ͢ͷؔٴͼBower
ͷґଘؔͱPreludeϞδϡʔϧͷϦετΛݟΔ͜ͱ͕Ͱ͖Δ
26
3ষ ؔͱϨίʔυ ୯७ͳܕ (6/7)
• ϑΝΠϧͷτοϓϨϕϧͰɺ߸ͷલʹҾΛࢦఆ͢Δ͜ͱͰ
ؔΛఆٛ
add :: Int -> Int -> Int
add x y = x + y
• όοΫεϥογϡʹʹଓ͚ۭͯനจࣈͰ۠ΒΕͨҾ໊ͷϦετ
Λॻ͘ͱɺؔΛΠϯϥΠϯͰఆٛ͢ΔͰ͖Δ
• ෳߦͷఆٛΛPSCiʹೖྗ͢Δͱ͖ʹɺpasteίϚϯυͰ”ϖʔε
τϞʔυ"ʹೖΔ͜ͱ͕Ͱ͖Δ
• ͜ͷϞʔυͰɺఆٛControl-DͰऴྃ
> :paste
… let
… add :: Int -> Int -> Int
… add = \x y -> x + y
… ^D
39
3ষ ؔͱϨίʔυ ྔԽ͞Εͨܕ (1/3)
• flipؔ࣍ͷΑ͏ͳܕΛ͍࣋ͬͯΔ
> :type flip
forall a b c. (a -> b -> c) -> b -> a -> c
• ͜ͷforallΩʔϫʔυflip͕શশྔԽ͞Εͨܕ(universally
quantified type)Λ͍࣋ͬͯΔ͜ͱΛࣔ͢
• ͜ΕɺabɺcΛͲͷܕʹஔ͖͑ͯɺflipͦͷܕͰ͏·͘
ಈ࡞͢Δͱ͍͏ҙຯ
• ྫ͑ɺaΛIntɺbΛStringɺcΛStringʹ͢Δ߹ɺflipͷ
ܕΛ࣍ͷΑ͏ʹಛघԽ(specialize)Ͱ͖Δ
(Int -> String -> String) -> String -> Int -> String
41
Slide 42
Slide 42 text
3ষ ؔͱϨίʔυ ྔԽ͞Εͨܕ (2/3)
• ྔԽ͞ΕͨܕͷಛघԽࣗಈతʹߦΘΕΔ
• ͢ͰʹͦͷܕͷflipΛ͍͔࣋ͬͯͨͷΑ͏ʹɺ࣍ͷΑ͏ʹflipΛ
͑Δ
> flip (\n s -> show n <> s) "Ten" 10
“10Ten”
• flipɺೋҾؔΛड͚औͬͯୈҰҾͱୈೋҾΛೖΕସ͑ͨ
ؔʹ͢Δؔ
42
Slide 43
Slide 43 text
3ষ ؔͱϨίʔυ ྔԽ͞Εͨܕ (3/3)
• aɺbɺcͷܕͲΜͳܕͰબͿ͜ͱ͕Ͱ͖Δͱ͍ͬͯɺܕͷෆ
߹ੜ͡ͳ͍Α͏ʹ͠ͳ͚ΕͳΒͳ͍
• flipʹؔ͢ͷܕɺଞͷҾͷܕͱ߹͠ͳ͚ΕͳΒͳ͍
• ୈ̎Ҿͱͯ͠10ɺୈ̏Ҿͱͯ͠จࣈྻ”Ten”Λ͢ͱ͏·͘
͍͔ͳ͍
> flip (\n s -> show n <> s) 10 "Ten"
Could not match type Int with type String
43
Slide 44
Slide 44 text
3ষ ؔͱϨίʔυ ࣈԼ͛ʹ͍ͭͯͷҙ (1/3)
• JavaScriptͱҟͳΓɺPureScriptͷίʔυࣈԼ͛ͷେ͖͞ʹӨڹ͞ΕΔ
(indentation-sensitive)
• PureScriptͰۭന͕ίʔυͷ·ͱ·ΓΛࣔ͢ͷʹΘΕΔ
• એݴ͕ෳߦʹΘͨΔ߹ɺ̎ͭΊͷߦ࠷ॳͷߦͷࣈԼ͛ΑΓਂ͘ࣈԼ͛
͠ͳ͚Εͳ͍
• ࣍ਖ਼͍͠PureScriptίʔυ
add x y z = x +
y + z
• ࣍ਖ਼͍͠ίʔυͰͳ͍
add x y z = x +
y + z
• ͦΕͧΕͷߦ͝ͱʹͻͱͭɺͭ·Γ2ͭͷએݴͰ͋Δͱߏจղੳ͢Δ
44
Slide 45
Slide 45 text
3ষ ؔͱϨίʔυ ࣈԼ͛ʹ͍ͭͯͷҙ (2/3)
• ಉ͡ϒϩοΫͰఆٛ͞Εͨએݴಉ͡ਂ͞ͰࣈԼ͛͢Δ
• ྫ͑PSCiͰletจͷએݴಉ͡ਂ͞ͰࣈԼ͛͠ͳ͚ΕͳΒͳ͍
• ࣍ਖ਼͍͠ίʔυ
> :paste
… let x = 1
… y = 2
… ^D
• ͜Εਖ਼͘͠ͳ͍
> :paste
… let x = 1
… y = 2
… ^D
45
Slide 46
Slide 46 text
3ষ ؔͱϨίʔυ ࣈԼ͛ʹ͍ͭͯͷҙ (3/3)
• PureScriptͷ͍͔ͭ͘ͷ༧ޠʢྫ͑ whereofɺletʣ৽ͨ
ͳίʔυͷ·ͱ·ΓΛಋೖ͢Δ
• ͦͷίʔυͷ·ͱ·ΓͷએݴͦΕΑΓਂ͘ࣈԼ͛͞ΕΔ
example x y z = foo + bar
where
foo = x * y
bar = y * z
• ͨͩ͠ɺιʔεϑΝΠϧͷઌ಄ɺ࠷ॳͷ moduleએݴʹ͓͚Δ༧
ޠwhere͚ͩɺ͜ͷنଇͷ།Ұͷྫ֎
46
3ষ ؔͱϨίʔυ ܕߏஙࢠͱछ (2/3)
• (ܕऍԋࢉࢠ ::Λͬͯ)͠ܕListͷΛؒҧͬͯఆٛ͠Α͏ͱ͢
Δͱɺࠓ·Ͱݟͨ͜ͱͷͳ͍Α͏ͳछྨͷΤϥʔ͕දࣔ͞ΕΔ
> import Data.List
> Nil :: List
In a type-annotated expression x :: t, the type t must have
kind *
• ͜ΕछΤϥʔ(kind error)
• ͕ͦͷܕͰ۠ผ͞ΕΔͷͱಉ͡Α͏ʹɺܕͦͷछ(kind)ʹΑͬ
ͯ۠ผ͞Εɺؒҧͬͨܕͷ͕ܕΤϥʔʹͳΔΑ͏ʹɺؒҧͬͨछ
ͷܕछΤϥʔΛҾ͖ى͜͢
51
3ষ ؔͱϨίʔυ ॅॴͷ͍߹Θͤ (2/6)
• ͜ͷେ·͔ͳ༷ʹैͬͯɺ͜ͷؔͷܕΛܭࢉ͢Δ͜ͱ͕Ͱ͖Δ
• ·ͣPSCiΛىಈ͠ɺfilterؔͱheadؔͷܕΛݟΔ
$ pulp psci
> import Data.List
> :type filter
forall a. (a -> Boolean) -> List a -> List a
> :type head
forall a. List a -> Maybe a
68
3ষ ؔͱϨίʔυ தஔͷؔద༻ (1/2)
• headؔதஔͷ$ԋࢉࢠΛͬͯࣜfilter filterEntry bookʹ
ద༻͞Ε͍ͯΔ
• ͜Εhead (filter filterEntry book)ͱ͍͏௨ৗͷؔద༻ͱ
ಉ͡ҙຯ
• ($)PreludeͰఆٛ͞Ε͍ͯΔ௨ৗͷؔͰɺఆٛҎԼ
apply :: forall a b. (a -> b) -> a -> b
apply f x = f x
infixr 0 apply as $
• ($)ؔͱΛͱΓɺͦͷʹͦͷؔΛద༻
• infixrΩʔϫʔυɺ($)ΛapplyͷΤΠϦΞεͱͯ͠ఆٛ͢Δͨ
ΊʹΘΕΔ
73
Slide 74
Slide 74 text
3ষ ؔͱϨίʔυ தஔͷؔద༻ (2/2)
• ͳͥ௨ৗͷؔద༻ͷΘΓʹ$Λͬͨͷ͔ʁ
• ͦͷཧ༝$͕ӈ݁߹Ͱ༏ઌॱҐͷ͍ԋࢉࢠͰ͋ΔͨΊ
• ਂ͍ೖΕࢠʹͳͬͨؔద༻ͷͨΊͷׅހΛɺ$Λ͏ͱऔΓআ
͘͜ͱ͕Ͱ͖Δ
• ͨͱ͑ɺ͋Δैۀһͷ্࢘ͷॅॴ͕͋Δಓ࿏Λݟ͚ͭΔɺ࣍ͷೖ
Εࢠʹͳͬͨؔద༻Λߟ͑ͯΈΔ
street (address (boss employee))
• $Λ༻ͯ͠දݱ͢Δͱͣͬͱ؆୯ʹͳΔ
street $ address $ boss employee
74