2016-03-28 7 views
2

Ich schrieb den Code:Haskell Typ Ausgabe

{-# LANGUAGE InstanceSigs #-} 
{-# LANGUAGE FlexibleInstances #-} 

module MonoidApp where 

class Monoid' a where 
    mempty' :: a 
    mappend' :: a -> a -> a 

    mconcat' :: [a] -> a 
    mconcat' = foldr mappend' mempty' 

instance Monoid' Int where 
    mempty' :: Int a => a 
    mempty' = 0 

    mappend' :: Int a => a -> a -> a 
    mappend' a b = (+) a b 

Aber es läuft in die Irre:

‘Int’ is applied to too many type arguments 
    In the type signature for ‘mempty'’: mempty' :: Int a => a 
    In the instance declaration for ‘Monoid' Int’ 
Failed, modules loaded: none. 

Irgendwelche Ideen, warum?

+1

Die Fehlermeldung ist ziemlich klar: 'Int' ein Typ ohne Parameter ist, aber Sie haben versucht, es zu beantragen. Ich vermute, du meinst eigentlich 'mempty' :: Int; Mappend ':: Int -> Int -> Int'. –

+0

Was passiert, wenn Sie die Zeilen 'mempty ':: Int a => a' und' mappend ':: Int a => a -> a -> a' auslassen? –

+0

@JJHakala Dann kann ich die Funktion mit Parameter ('mappend '1 2') nicht verwenden: _Keine Instanz für (Num a0) die sich aus einer Verwendung von' it'_ ergibt – barbara

Antwort

3

es sein sollte:

instance Monoid' Int where 
    mempty' :: Int 
    mempty' = 0 

    mappend' :: Int -> Int -> Int 
    mappend' a b = (+) a b 
+0

Aktualisierte Frage. – barbara