۱۱ - ۱۴تایپِ تابع، معادلِ توان

در محاسبه‌ی تعداد سَکَنه‌ی تایپ‌ها، تایپِ تابع، اوپراتورِ توان ِه. تعداد اعضای تابعِ ‏‎a -> b‎‏ رو میشه با فرمولِ ‏‎ba‎‏ پیدا کرد.

پس اگه ‏‎b‎‏ و ‏‎a‎‏ تایپِ ‏‎Bool‎‏ باشن، با ۲۲ میشه تعداد سَکَنه‌ی یه تابعِ ‏‎Bool -> Bool‎‏ رو محاسبه کرد. همینطور برای تابعی که ‏‎Bool‎‏ بگیره و یه چیزی با ۳ عضو برگردونه، میشه ۳۲ و در نتیجه به نُه حالت میشه اون تابع رو تعریف کرد.

a -> b -> c

(c ^ b) ^ a

-- با توجه به قوانین حساب،
-- میشه اینطور بازنویسی کرد
c ^ (b * a)

قبلاً گفتیم که تایپِ ‏‎(Bool,Bool)‎‏ چهار عضو داره. میشه تک‌تک‌شون رو نوشت، یا کار راحت‌تر اینه که ‏‎(1 + 1) * (1 + 1)‎‏ رو حساب کنیم. حالا می‌بینیم که در جبر ِ تایپ‌ها، تایپِ تابع ‏‎(->)‎‏ نقشِ توان رو داره. از یه نوع‌داده با سه حالت استفاده می‌کنیم، چون ‏‎Bool‎‏ یه گیری داره: دو به‌اضافه‌ی دو، دو ضربدر دو، و دو به‌توان دو همه مساویِ یه چیز اند. حساب ِ تایپ‌های جمع رو یه دوره کنیم:

data Quantum =
    Yes
  | No
  | Both
  deriving (Eq, Show)

-- 3 + 3
quantSum1 :: Either Quantum Quantum
quantSum1 = Right Yes

quantSum2 :: Either Quantum Quantum
quantSum2 = Right No

quantSum3 :: Either Quantum Quantum
quantSum3 = Right Both

quantSum4 :: Either Quantum Quantum
quantSum4 = Left Yes
-- دو تای دیگه رو خودتون بنویسین

حالا حساب ِ تایپ‌های ضرب:

-- 3 * 3
quantProd1 :: (Quantum, Quantum)
quantProd1 = (Yes, Yes)

quantProd2 :: (Quantum, Quantum)
quantProd2 = (Yes, No)

quantProd3 :: (Quantum, Quantum)
quantProd3 = (Yes, Both)

quantProd4 :: (Quantum, Quantum)
quantProd4 = (No, Yes)

quantProd5 :: (Quantum, Quantum)
quantProd5 = (No, No)

quantProd6 :: (Quantum, Quantum)
quantProd6 = (No, Both)

quantProd7 :: (Quantum, Quantum)
quantProd7 = (Both, Yes)
-- دو تای دیگه با خودتون

و حالا یه تایپِ تابع. هر تعریفِ یکتا از تابع، یک سَکَنه محسوب میشه:

-- 3 ^ 3
quantFlip1 :: Quantum -> Quantum
quantFlip1 Yes  = Yes
quantFlip1 No   = Yes
quantFlip1 Both = Yes

quantFlip2 :: Quantum -> Quantum
quantFlip2 Yes  = Yes
quantFlip2 No   = Yes
quantFlip2 Both = No

quantFlip3 :: Quantum -> Quantum
quantFlip3 Yes  = Yes
quantFlip3 No   = Yes
quantFlip3 Both = Both

quantFlip4 :: Quantum -> Quantum
quantFlip4 Yes  = Yes
quantFlip4 No   = No
quantFlip4 Both = Yes

quantFlip5 :: Quantum -> Quantum
quantFlip5 Yes  = Yes
quantFlip5 No   = Both
quantFlip5 Both = Yes

quantFlip6 :: Quantum -> Quantum
quantFlip6 Yes  = No
quantFlip6 No   = Yes
quantFlip6 Both = Yes

quantFlip7 :: Quantum -> Quantum
quantFlip7 Yes  = Both
quantFlip7 No   = Yes
quantFlip7 Both = Yes

quantFlip8 :: Quantum -> Quantum
quantFlip8 Yes  = Both
quantFlip8 No   = Yes
quantFlip8 Both = No

quantFlip9 :: Quantum -> Quantum
quantFlip9 Yes  = Both
quantFlip9 No   = No
quantFlip9 Both = No

quantFlip10 :: Quantum -> Quantum
quantFlip10 Yes  = Both
quantFlip10 No   = No
quantFlip10 Both = Both

-- بقیه رو خودتون می‌تونین بنویسین

به توان رسوندن با چه ترتیبی؟

تابعِ زیر رو فرض کنین:

convert :: Quantum -> Bool
convert = undefined

از روی فرمولِ ‏‎ba‎‏ برای ‏‎a -> b‎‏ باید ۲۳ یا ۸ تعریف از این تابع وجود داشته باشه. آیا برقراره؟ بنویسین و برای خودتون اثبات کنین.

تمرین‌ها: چهارتایی

تعداد اعضای یکتای هر تایپ رو تعیین کنین.

پیشنهاد: تعداد رو حساب کنین. اگه بخواین همه رو بنویسین زود خسته‌کننده میشه.

۱.

data Quad =
    One
  | Two
  | Three
  | Four
  deriving (Eq, Show)

-- این چند حالت داره؟
eQuad :: Either Quad Quad
eQuad = ???

۲.

prodQuad :: (Quad, Quad)

۳.

funcQuad :: Quad -> Quad

۴.

prodTBool :: (Bool, Bool, Bool)

۵.

gTwo :: Bool -> Bool -> Bool

۶.

-- راهنمایی: عدد ۵ رقمی
fTwo :: Bool -> Quad -> Quad