۴ - ۹تمرین‌های فصل

مثل فصل‌های قبل، باز هم پیشنهاد می‌کنیم قبل از اجرای کدها در REPL، اول به جواب برسین؛ اما جوابتون رو حتماً با REPL چک کنین. برای تمرین‌های زیر، مقادیر awsome،also، و allAwesome که بالاتر تعریف کردیم رو هم لازم دارین. برای راحتی اینجا هم نوشتیم:

awesome = ["Papuchon", "curry", ":)"]
also = ["Quake", "The Simons"]
allAwesome = [awesome, also]

length تابعی‌ه که یه لیست می‌گیره و عددِ خروجی‌ش تعداد المان‌های اون لیست رو نشون میده.

۱.

با توجه به تعریف بالا برای length، تایپ سیگنچرِش چی میشه؟ چندتا آرگومان (و با چه تایپی) می‌گیره؟ جواب نهاییِ این تابع از چه تایپی میشه؟

۲.

جواب بیانیه‌های زیر چی میشن؟

a)

length [1, 2, 3, 4, 5]

b)

length [(1, 2), (2, 3), (3, 4)]

c)

length allAwesome

d)

length (concat allAwesome)

۳.

یکی از این دو بیانیه‌ی زیر کار می‌کنه، ولی اون یکی خطا میده. با توجه به تایپ تابع length و اطلاعاتی که از تایپ‌های عددی داریم، بگین کدوم یکی و به چه دلیلی خطا میده.

(نکته: مثل تابع concat در فصل قبل، اینجا هم برای length تایپ Foldable t => t a رو – بجای [a] – می‌بینین. در واقع لیست فقط یکی از تایپ‌های ممکنه، ولی باز Foldable t رو لیست فرض کنید.)

Prelude> 6 / 3
-- و
Prelude> 6 / length [1, 2, 3]

۴.

چطور می‌تونین با استفاده از یه تابع/اوپراتورِ تقسیمِ دیگه، کد خرابِ بالا رو درست کنین؟

۵.

تایپ بیانیه‌ی 5 == 3 + 2 چیه؟ فکر می‌کنین جوابش چیه؟

۶.

تایپ و جواب کد زیر چیه؟

Prelude> let x = 5
Prelude> x + 3 == 5

۷.

بین کدهای زیر، کدوم‌ها کار می‌کنن؟ چرا کار می‌کنن/نمی‌کنن؟ اگه جواب دارن، به چه مقداری ساده میشن؟

Prelude> length allAwesome == 2
Prelude> length [1, 'a', 3, 'b']
Prelude> (8 == 8) && ('b' < 'a')
Prelude> (8 == 8) && 9

۸.

یک تابع بنویسین که بگه آیا string (یا لیست) ورودی واروخوانه هست یا نه. تابعِ از پیش تعریف شده‌ی reverse (م. به معنای معکوس) رو لازم دارین:

reverse :: [a] -> [a]
reverse "blah"
"halb"
isPalindrome :: (Eq a) => [a] -> Bool
isPalindrome x = undefined

۹.

با استفاده از if-then-else تابعی بنویسین که قدر مطلق یه عدد رو برگردونه.

myAbs :: Integer -> Integer
myAbs = undefined

۱۰.

با توابع fst و snd، توصیف تابع زیر رو بنویسین:

f :: (a, b) -> (c, d) -> ((b, d), (a, c))
f = undefined

تصحیح گرامر

مثال‌های زیر ایرادهای گرامری دارن. سعی کنید در برنامه‌ی ویرایش متن ِانتخابی‌تون، اونها رو تصحیح کنین، و بعد با GHC یا GHCi چک کنین.

۱.

اینجا تابعی می‌خوایم که یکی به طولِ آرگومان string ِش اضافه کنه، و نتیجه رو برگردونه.

x = (+)

F xs = w 'x' 1
     where w = length xs

۲.

این قراره تابع همانی،id، باشه.

\X = x

۳.

نسخه‌ی سالمِ این تابع، با ورودیِ (1,2)، مقدار ۱ رو برمی‌گردونه.

f (a b) = A

اسم توابع رو با تایپ‌شون تطبیق بدین

۱.

کدوم یکی تایپِ show ِه؟

a)

show a => a -> String

b)

Show a -> a -> String

c)

Show a => a -> String

۲.

کدوم یکی تایپِ (==) ِه؟

a)

a -> a -> Bool

b)

Eq a => a -> a -> Bool

c)

Eq a -> a -> a -> Bool

d)

Eq a => A -> Bool

۳.

کدوم یکی تایپِ fst ِه؟

a)

(a, b) -> a

b)

b -> a

c)

(a, b) -> b

۴.

کدوم یکی تایپِ (+) ِه؟

a)

(+) :: Num a -> a -> a -> Bool

b)

(+) :: Num a => a -> a -> Bool

c)

(+) :: num a => a -> a -> a

d)

(+) :: Num a => a -> a -> a

e)

(+) :: a -> a -> a