Myslím, že už tě chápu.
Ono by se to asi dalo říct i tak, že požaduješ nějakou vlastnost, která ale z definice nevyplývá. Nemusíme jít do monády, stačí nám funktor, ten je definovanej takhle:
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
- tam nikde nemáš řečený, že musí existovat způsob, jak můžeš z toho "boxu" tu hodnotu vytáhnout. To udělá implementace fmap pro konkrétní functor za tebe a opět ti vrátí jenom box, do kterýho se podívat nemůžeš, protože jeho strukturu obecně nemusíš znát. To, že ji u Maybe znáš a tímpádem můžeš tu hodnotu vytáhnout pattern matchingem je nějaká informace navíc, kterou
obecně definice Functoru nezaručuje.
...a dá se to říct i ještě abstraktněji: functor nemusí být ani žádný "box na hodnoty", je to prostě endofunctor
https://en.wikipedia.org/wiki/Functor