2016-03-28 9 views
2

は私が書いたコード:Haskellのタイプの問題

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

をしかし、それはエラーに実行されます。

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

任意のアイデアなぜですか?

+1

エラーメッセージは非常に明確である: 'Int'は、パラメータなしのタイプですが、あなたは1つにそれを適用しようとしました。私はあなたが実際に 'mempty ':: Intを意味すると思います。 mappend ':: Int - > Int - > Int'を参照してください。 –

+0

'mempty ':: Int a => a'と' mappend' :: Int a => a - > a - > a'の行を省略するとどうなりますか? –

+0

@JJHakalaそれでは、パラメータ( 'mappend '1 2')で関数を使うことはできません:' it'_の使用から生じる(Num a0)のインスタンスはありません – barbara

答えて

3

それは次のようになります。

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

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

質問が更新されました。 – barbara