2017-01-10 19 views
1

変換が空要素としてのアイデンティティ関数とバイナリ操作としての標準関数の構成で、変換がモノノイドを形成しなければならないかのように見えます。私はそれが特に有用だとは思わないが、可能でなければならない。線に沿って何か:変換のセットf :: a-> aは単項式の上に関数の構成を形成します - これをMonoidのインスタンスにするにはどうしたらいいですか?

Illegal instance declaration for ‘Monoid (a -> a)’ 
     (All instance types must be of the form (T a1 ... an) 
     where a1 ... an are *distinct type variables*, 
     and each type variable appears at most once in the instance head. 
     Use FlexibleInstances if you want to disable this.) 
    In the instance declaration for ‘Monoid (a -> a)’ 

私は」:上記

instance Monoid (a -> a) where 
     mempty = id 
     mappend f g = (.) 

instance Monoid b => Monoid (a -> b) where 
    mempty _ = mempty 
    mappend f g x = f x `mappend` g x 

エラーがあり、それが既存の定義によってマスクされている可能性があるため、コンパイルされません。私はまだHaskellのスクラブだから、どうすればこの問題を解決できるのか分かりません。

+2

二重引用符の回答の脚注として、「Endo」をうまく使用する例の1つは、[foldMap'の中の 'foldr'のためのデフォルト実装を取得しています(http://stackoverflow.com/q/23319683/2751851)。 – duplode

答えて

2

実際のエラーメッセージは非常によく、それを説明する:すべてのインスタンスタイプがフォームa1 ... an異なる型変数、 各型変数である(T a1 ... an) でなければならない

a -> aも特定の種類でありますインスタンスヘッダーにはたかだか1回しか出現しません。

ここTは、関数型->である、あなたは特別な中置記法

instance Monoid ((->) a a) where … 

せずに書かれていたかもしれないと明確にaは一度しか表示されません。あなたはこの[制限]を無効にしたい場合は、この問題を解決することができますどのようにオン

は、再びエラーメッセージが使用FlexibleInstances

を推奨しています。

+1

また、 'TypeFamilies'を使って' instance a〜b => Monoid(a - > b) 'と書くこともできます。 –

関連する問題