following commands are available: :? Show this help menu :quit Quit PSCi :reset Reset :browse <module> Browse <module> :type <expr> Show the type of <expr> :kind <type> Show the kind of <type> :show import Show imported modules :show loaded Show loaded modules :paste paste Enter multiple lines, terminated by ^D • TabΩʔΛԡ͢ͱɺࣗͷίʔυͰར༻Մೳͳͯ͢ͷؔٴͼBower ͷґଘؔͱPreludeϞδϡʔϧͷϦετΛݟΔ͜ͱ͕Ͱ͖Δ 26
2, 3] Array Int > :type [true, false] Array Boolean > :type [1, false] Could not match type Int with Boolean. • ࠷ޙͷྫͰى͖͍ͯΔΤϥʔܕݕূثʹΑͬͯใࠂ͞ΕͨͷͰɺ ྻͷ2ͭͷཁૉͷܕΛ୯ҰԽ(Unification)͠Α͏ͱࣦͯ͠ഊͨ͜͠ ͱࣔ͢ 36
-> Int -> Int add x y = x + y • όοΫεϥογϡʹʹଓ͚ۭͯനจࣈͰ۠ΒΕͨҾ໊ͷϦετ Λॻ͘ͱɺؔΛΠϯϥΠϯͰఆٛ͢ΔͰ͖Δ • ෳߦͷఆٛΛPSCiʹೖྗ͢Δͱ͖ʹɺpasteίϚϯυͰ”ϖʔε τϞʔυ"ʹೖΔ͜ͱ͕Ͱ͖Δ • ͜ͷϞʔυͰɺఆٛControl-DͰऴྃ > :paste … let … add :: Int -> Int -> Int … add = \x y -> x + y … ^D 39
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
એݴ͕ෳߦʹΘͨΔ߹ɺ̎ͭΊͷߦ࠷ॳͷߦͷࣈԼ͛ΑΓਂ͘ࣈԼ͛ ͠ͳ͚Εͳ͍ • ࣍ਖ਼͍͠PureScriptίʔυ add x y z = x + y + z • ࣍ਖ਼͍͠ίʔυͰͳ͍ add x y z = x + y + z • ͦΕͧΕͷߦ͝ͱʹͻͱͭɺͭ·Γ2ͭͷએݴͰ͋Δͱߏจղੳ͢Δ 44
Data.List > Nil :: List In a type-annotated expression x :: t, the type t must have kind * • ͜ΕछΤϥʔ(kind error) • ͕ͦͷܕͰ۠ผ͞ΕΔͷͱಉ͡Α͏ʹɺܕͦͷछ(kind)ʹΑͬ ͯ۠ผ͞Εɺؒҧͬͨܕͷ͕ܕΤϥʔʹͳΔΑ͏ʹɺؒҧͬͨछ ͷܕछΤϥʔΛҾ͖ى͜͢ 51
data structure)ͷҰྫ • ͜ΕPureScriptʹ͓͚Δॏཁͳߟ͑ํ • มߋίʔυͷ෭࡞༻Ͱ͋ΓɺίʔυͷৼΔ͍ʹ͍ͭͯͷஅ͢ΔͷΛ͘͢͠ Δ • Data.ListͷConsؔΛ༻͢ΔͱinsertEntryΛ࣮Ͱ͖Δ • PSCiΛىಈ͠:typeίϚϯυΛͬͯɺConsؔͷܕΛݟͯΈΔ $ pulp psci > import Data.List > :type Cons forall a. a -> List a -> List a 59
͜Ε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
book = head $ filter filterEntry book ! findEntry firstName lastName = head <<< filter filterEntry where … • ӈลΛ࣍ͷΑ͏ʹͯ͠ಉ͡ head $ filter filterEntry ! filter filterEntry >>> head • ͜ΕʮfindEntryϑΟϧλϦϯάؔͱheadؔͷ߹Ͱ͋Δʯ ͱ͍͏findEntryؔͷΘ͔Γ͍͢ఆٛ 76
import Data.AddressBook • ۭͷॅॴ͔Β߲Λݕࡧʢۭͷ݁Ռ͕ฦͬͯ͘Δ͜ͱΛظʣ > findEntry "John" "Smith" emptyBook No type class instance was found for Data.Show.Show { firstName :: String , lastName :: String , address :: { street :: String , city :: String , state :: String } } • ܕEntryͷΛจࣈྻͱͯ͠ग़ྗ͢Δํ๏ΛPSCi͕Βͳ͍ͱ͍͏ҙຯͷΤϥʔ 77