۱۶ - ۱۷تمرینهای فصل
مشخص کنین که آیا میشه یه Functor
ِ معتبر برای نوعدادههای زیر نوشت یا نه.
۱.
data Bool =
False | True
۲.
data BoolAndSomethingElse a =
False' a | True' a
۳.
data BoolAndMaybeSomethingElse =
Falsish | Truish a
۴.
از کایندها برای این تمرین کمک بگیرین، خیلی درگیرِ جزئیات نشین.
newtype Mu f = Inf { outF :: f (Mu f) }
۵.
باز هم با کایندها پیش برین و تیکههای ناآشنا رو نادیده بگیرین.
import GHC.Arr
data D =
D (Array Word Word) Int Int
آرگومانهای نوعسازها رو جابجا کنین تا نمونه ِ Functor
کار کنه.
۱.
data Sum a b =
First a
| Second b
instance Functor (Sum e) where
fmap f (First a) = First (f a)
fmap _ (Second b) = Second b
۲.
data Company a b c =
DeepBlue a c
| Something b
instance Functor (Company e e') where
fmap f (Something b) = Something (f b)
fmap _ (DeepBlue a c) = DeepBlue a c
۳.
data More a b =
L a b a
| R b a b
deriving (Eq, Show)
instance Functor (More x) where
fmap f (L a b a') = L (f a) b (f a')
fmap f (R b a b') = R b (f a) b'
-- باید چنین کاری انجام بده
Prelude> fmap (+1) (L 1 2 3)
L 2 2 4
Prelude> fmap (+1) (R 1 2 3)
R 1 3 3
برای نوعدادههای زیر نمونه ِ Functor
بنویسین.
۱.
data Quant a b =
Finance
| Desk a
| Bloor b
۲.
-- نه، به خودیِخود جذابیتی نداره
data K a b =
K a
۳.
{-# LANGUAGE FlexibleInstances #-}
newtype Flip f a b =
Flip (f b a)
deriving (Eq, Show)
newtype K a b =
K a
-- احتمالاً یکی از نمونههایی که
-- قبلاً نوشتین رو یادتون بیاره
instance Functor (Flip K a) where
fmap = undefined
۴.
data EvilGoateeConst a b =
GoatyConst b
-- فکر کردین میشه به این راحتیا
-- .از دست بزغالهها خلاص شین؟ نخیر
نه، این هم کار جالبی نمیکنه. جادویی در کار نیست (تو تمرین قبل هم همینطور). اگه کار کنه یعنی درسته.
۵.
آیا یه چیزِ اضافه لازم دارین تا نمونه ِش کار کنه؟
data LiftItOut f a =
LiftItOut (f a)
۶.
data Parappa f g a =
DaWrappa (f a) (g a)
۷.
بیشتر از اونکه لازمه نمونه ِ تایپکلاس درخواست نکنین. به حرفِ GHC هم میتونین گوش کنین.
data IgnoreOne f g a b =
IgnoringSomething (f a) (g b)
۸.
data Notorious g o a t =
Notorious (g o) (g a) (g t)
۹.
-- استفاده کنین recursion باید از
data List a =
Nil
| Cons a (List a)
۱۰.
-- !یه درخت بزغاله، میشه ارباب بزغاله
data GoatLord a =
NoGoat
| OneGoat a
| MoreGoats (GoatLord a)
(GoatLord a)
(GoatLord a)
۱۱.
برای این تمرین از یه فانکتور ِ اضافه استفاده میکنین، البته میتونین بدون استفاده از fmap
هم بصورتِ مونومورفیک حل کنین. به خاطر داشته باشین که احتمالاً نتونین صحت این رو طبق معمول تأیید کنین. تمام تلاشتون رو کنین که کار کنه.*
data TalkToMe =
Halt
| Print String a
| Read (String -> a)
با تشکر از آندراش باشت به خاطر این تمرین.