2016-08-08 42 views
6

Ich habe festgestellt, dass ich dies tun kann 1 :: Product Int und erhalten als Ergebnis.newtype Verhalten in Haskell

Product ist ein newtype definiert in Data.Monoid. Als ich habe versucht, die Definition meiner eigenen newtype wie so:

newtype Stuff a = Stuff {getStuff :: a} deriving (Show) 

Aber wenn ich versuche, 1 :: Stuff Int zu tun bekomme ich einen Fehler:

<interactive>:20:1: error: 
* No instance for (Num (Stuff Int)) arising from the literal `1' 
* In the expression: 1 :: Stuff Int 
    In an equation for `it': it = 1 :: Stuff Int 

Muss ich Num Einschränkung auf a oder etwas zu setzen haben? Warum funktioniert das nicht?

Antwort

15

Sie können 1 :: T nur dann tun, wenn T eine Instanz von Num ist. 1 :: Product Int funktioniert, weil Product eine Instanz instance Num a => Num (Product a) definiert (d. H. Wenn a eine Instanz von Num ist, ist Product a auch eine Instanz von Num).

Muss ich Num auf ein oder etwas setzen?

Sie haben eine Num Instanz für Stuff Int (oder besser für Num a => Stuff a) zu definieren.

Sie können entweder die manuell (mit instance) oder automatisch unter Verwendung von deriving Num und die GeneralizedNewtypeDeriving Erweiterung, die eine Instanz für NumNum a => Stuff a wird definieren, die genau wie die Num Instanz für die gegebenen a wirken.