guard :: (MonadPlus m) => Bool -> m()
guard True = return()
guard False = mzero
Prelude Control.Monad> :t mzero
mzero :: (MonadPlus m) => m a
Im falschen Zweig der guard
, ist die Art der mzero
m a
, aber der Rückgabetyp von guard
wird als m()
angegeben wurde. Daher verstehe ich nicht ganz, warum der Compiler sich darüber nicht beschweren wird.sind ein 'vs 'm()' in guard
Ich meine, wenn mzero
gibt einen Wert als Maybe Int
eingegeben, die natürlich anders ist als Maybe()
, richtig?
'mzero' kann etwas wie 'Maybe Int' zurückgeben, oder? Ich denke es ist anders als 'Maybe()' – aXqd
@aXqd: Für die Maybe Monade, 'mzero = Nothing', die keinen bevorzugten Typ für' a' hat. Wenn Sie tatsächlich 'Nothing' auf' Maybe Int' setzen, ist es anders als 'Maybe()'. Der Typ ist jedoch "Maybe a" für ein mögliches "a", nicht "Maybe Int", also ist "Maybe()" gültig. – kennytm
@KennyTM Vielen Dank für Ihre Antwort. Ja, ich könnte ein schlechtes Beispiel verwenden. Wenn ich jedoch einen benutzerdefinierten Typ schreibe - "MyType", und mache es dann zur Instanz von "Monad" und "MonadPlus". Ich kann 'mzero' dann 'MyType Int' zurückgeben. In der Tat, ich denke, wenn es eine Chance gibt, dass das, was von 'mzero' zurückgegeben wird, nicht 'm()' ist, sollte der Compiler darüber klagen. Weil der Typ von 'mzero' und der Rückgabetyp von 'guard' nicht miteinander übereinstimmen. Ich weiß, dass ich bei dieser Schlussfolgerung falsch liege. Ich bin mir nur nicht sicher, wo das Problem liegt. : P – aXqd