If something is Iterable, it's a Functor, but not the other way around. Iterable implies there's an order to the elements, for instance. It also implies that you could get ahold of the elements if you chose.
Types which are Functors may have orders and may provide access to the elements, but the Functor interface does not provide those means. This allows you to instantitate more restrictive types. For instance (in Haskell notation)
data Pretend a = Pretend
is a data type with only one element (`Pretend`) that pretends to be a container. Consider the two types
Array Int
Pretend Int
You can still consider Pretend to be a Functor (the mapping function is just a no-op) but it certainly isn't iterable.
In Haskell, Iterable is called Foldable and effectively is the following interface
instance Foldable c where
toList :: c a -> [a]
but `Foldable` is used because typically instead of converting it to a list you want to fold over the elements
fold :: Foldable c => (a -> b -> b) -> b -> c a -> b
Types which are Functors may have orders and may provide access to the elements, but the Functor interface does not provide those means. This allows you to instantitate more restrictive types. For instance (in Haskell notation)
is a data type with only one element (`Pretend`) that pretends to be a container. Consider the two types You can still consider Pretend to be a Functor (the mapping function is just a no-op) but it certainly isn't iterable.In Haskell, Iterable is called Foldable and effectively is the following interface
but `Foldable` is used because typically instead of converting it to a list you want to fold over the elements