۱۶ - ۱۷تمرینهای فصل
مشخص کنین که آیا میشه یه 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)با تشکر از آندراش باشت به خاطر این تمرین.