Một số trường hợp của Category
cũng là trường hợp của Functor
. Ví dụ:Là ( f -> fmap f id) luôn luôn tương đương với arr?
{-# LANGUAGE ExistentialQuantification, TupleSections #-}
import Prelude hiding (id, (.))
import Control.Category
import Control.Arrow
data State a b = forall s. State (s -> a -> (s, b)) s
apply :: State a b -> a -> b
apply (State f s) = snd . f s
assoc :: (a, (b, c)) -> ((a, b), c)
assoc (a, (b, c)) = ((a, b), c)
instance Category State where
id = State (,)()
State g t . State f s = State (\(s, t) -> assoc . fmap (g t) . f s) (s, t)
(.:) :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b)
(.:) = fmap . fmap
instance Functor (State a) where
fmap g (State f s) = State (fmap g .: f) s
instance Arrow State where
arr f = fmap f id
first (State f s) = State (\s (x, y) -> fmap (,y) (f s x)) s
Đây arr f = fmap f id
cho instance Arrow State
. Điều này có đúng với mọi trường hợp của Category
cũng là trường hợp của Functor
không? Các chữ ký loại là:
arr :: Arrow a => (b -> c) -> a b c
(\f -> fmap f id) :: (Functor (a t), Category a) => (b -> c) -> a b c
Dường như với tôi rằng chúng phải tương đương nhau.
Ít nhất, luật 'Arrow' đủ để * xác định * một cá thể tuân thủ luật' Functor' bằng 'instance Arrow a => Functor (a s) trong đó fmap f v = v >>> arr f'. Có lẽ điều đó cùng với tham số là đủ để đảm bảo rằng đây cũng là trường hợp duy nhất tuân theo luật * duy nhất, mặc dù tôi đã không làm rõ các chi tiết nên tôi sẽ không tuyên bố nó là đúng. –
Hãy nhớ rằng, đối với các hàm và mũi tên, 'fmap' phải bằng' (<<<) '. – AJFarmar
[Nhận xét này] (http://stackoverflow.com/questions/28395214/automatic-functor-instance#comment45136634_28395214) gợi ý rằng tôi đã đúng: tham số đảm bảo tối đa một cá thể tuân thủ pháp luật 'Functor'. Vì vậy, câu trả lời cho câu hỏi của bạn có vẻ là "có". –