۱۶ - ۱۷تمرین‌های فصل

مشخص کنین که آیا میشه یه ‏‎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)
*

با تشکر از آندراش باشت به خاطر این تمرین.