В следующем коде GHC не может найти экземпляр Functor в определении экземпляра Monoidal.
Почему GHC не делает вывод, что данное ограничение Applicative выполнено, то Functor должно где-то уже быть? (Есть ли название для этой «способности» рассуждения?)
import Prelude hiding (Applicative (..), Monad (..))
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Monoidal f where
unit::f ()
(*) ::f a -> f b -> f (a,b)
instance Applicative f => Monoidal f where
unit = pure ()
a * b = undefined
Я знаю, что мог бы, конечно, добавить явное ограничение Functor f к Monoidal, чтобы не было ошибки, но мой вопрос больше о том, почему разрешение экземпляра работает таким образом.
import Prelude hiding ((*), Applicative (..), Monad (..))
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Monoidal f where
unit::f ()
(*) ::f a -> f b -> f (a,b)
instance (Applicative f, Functor f) => Monoidal f where
unit = pure ()
a * b = (pure (,) <*> a <*> b )
instance (Monoidal f, Functor f) => Applicative f where
pure x = fmap (\_ -> x) unit
mu <*> mx = fmap (\(f, x) -> f x) ((mu * mx) :: f (a -> b, a))