4

私はこれを試しています(学習目的で):

{-# LANGUAGE FlexibleInstances #-}

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

に等しいと期待id <> idするid . id

ただし、次の(id <> id) 1エラーが表示されます。

Non type-variable argument in the constraint: Monoid (a -> a)

実行するには何を変更すればよいですか?

モノイドと Haskell 型クラスをよりよく理解するためのものであり、実用的な使用法ではありません

4

2 に答える 2

5

{-# OVERLAPPING #-}GHC.Base にはMonoid (a -> b)b がモノイドの場合のインスタンスがあるため、これにはプラグマが必要です。

{-# LANGUAGE FlexibleInstances #-}
import Data.Monoid (Monoid, mempty, mappend, (<>))

instance {-# OVERLAPPING #-} Monoid (a -> a) where
    mempty = id
    mappend f g = f . g

次に、がモノイドa -> aであっても、上記のインスタンスが呼び出されます。a

\> (id <> id) 1
1
\> (id <> id) [1]
[1]

一方、Monoid b => a -> bGHC.Base のインスタンスでは次のように呼び出されます。

\> ((:[]) <> (:[])) 1
[1,1]

あなたのものとまったく同じインスタンスData.Monoidを提供することに注意してくださいが、オーバーラップは を使用してバイパスされます。a -> anewtype Endo a

于 2016-06-18T15:40:53.200 に答える