Im folgenden Code kann GHC die Funktor-Instanz in der Definition der Monoidal
Instanz nicht finden.Superklasse kann nicht abgeleitet werden
Warum nicht GHC herzuleiten, dass gegeben die Applicative
Einschränkung erfüllt ist, dann ist die Functor
hat irgendwo schon zu sein? (Gibt es einen Namen zu dieser Argumentation ‚Fähigkeit‘?)
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
Ich weiß natürlich könnte eine explizite Functor f
Einschränkung Monoidal
Fügen Sie nicht den Fehler haben, aber meine Frage ist, mehr darüber, warum funktioniert Instanz Auflösung auf diese Weise
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))
Ich hoffe, es ist klar, dass eine solche Instanz nicht viel Sinn macht! - Trotzdem, gute Frage, ich hätte auch den Compiler angenommen, dies zuzulassen und die Superklasse herauszufinden. – leftaroundabout
Das Grundproblem, das ich sehe, ist, dass Sie sowohl "Functor f => Monoidal f" und "Applicative f => Monoidal f" haben. Wie ich es verstehe, muss der Compiler nur einen möglichen Ableitungspfad für eine bestimmte Typklasse auf einem bestimmten Typ sehen. – NovaDenizen
@leftaroundabout, weil es ein Isomorphismus ist hin und her ist das, was du meinst? deshalb legte ich die iso, um daran erinnert zu werden – nicolas