2016-03-28 26 views
2

Ben kodu yazdı:Haskell Tipi sorunu

{-# 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 

Ama yanılgıya çalıştırır:

‘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. 

Herhangi bir fikir neden?

+1

hata mesajı oldukça açıktır. Sanırım aslında 'mempty' demek istediniz :: Int; mappend ':: Int -> Int -> Int'. –

+0

Eğer 'mempty' çizgilerini dışarda bırakırsanız? :: Int a => a 've 'mappend' :: Int a => a -> a -> a'? –

+0

@JJHakala O zaman işlevini ('mappend '1 2') parametresiyle kullanamıyorum: _No örneği için' it'_ – barbara

cevap

3

Olmalıdır: Int` parametreleri olmayan bir türüdür `, ancak birine uygulamak için denedim:

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

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

Güncel soru. – barbara