۱۱ - ۱۴تایپِ تابع، معادلِ توان
در محاسبهی تعداد سَکَنهی تایپها، تایپِ تابع، اوپراتورِ توان ِه. تعداد اعضای تابعِ 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