2

Monoidのインスタンスを定義しようとしていますが、インスタンスHList Recordが重複しているというエラー メッセージが表示されます。私の試み(コードは複雑に見えますが、基本的にタプルインスタンスになるものです)

{-# LANGUAGE TypeFamilies, DataKinds, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
import Data.Monoid
import Data.HList.FakePrelude
import Data.HList.Record
import Data.HList.Labelable

instance (Monoid v1, Monoid v2) => 
         Monoid (Record '[Tagged (t1::Symbol) v1, Tagged (t2::Symbol) v2]) where
    mempty = (Label :: Label (t1::Symbol)) .=. mempty
          .*. (Label :: Label (t2::Symbol)) .=. mempty .*. emptyRecord
    mappend a b = (Label :: Label (t1::Symbol)) 
               .=. (a .!. (Label :: Label (t1::Symbol)))
               `mappend` (b .!. (Label :: Label (t1::Symbol)))
               .*.(Label :: Label (t2::Symbol)) 
               .=. (a .!. (Label :: Label (t2::Symbol))) 
               `mappend` (b .!. (Label :: Label (t2::Symbol)))
               .*. emptyRecord

エラーメッセージ:

Database/Harehouse/Utils.hs:185:59:
Overlapping instances for HEq Symbol l0 t1 b
  arising from a use of `.!.'
Matching instances:
  instance [overlap ok] 'False ~ b => HEq k x y b
    -- Defined in `Data.HList.TypeEqO'
  instance [overlap ok] HEq k x x 'True
    -- Defined in `Data.HList.TypeEqO'
(The choice depends on the instantiation of `t1, b, l0'
 To pick the first instance above, use -XIncoherentInstances
 when compiling the other instance declarations)
In the first argument of `mappend', namely
  `(a .!. (Label :: Label (t1 :: Symbol)))'
In the second argument of `(.=.)', namely
  `(a .!. (Label :: Label (t1 :: Symbol)))
   `mappend` (b .!. (Label :: Label (t1 :: Symbol)))'
In the first argument of `(.*.)', namely
  `(Label :: Label (t1 :: Symbol))
   .=.
     (a .!. (Label :: Label (t1 :: Symbol)))
     `mappend` (b .!. (Label :: Label (t1 :: Symbol)))'

どういう意味ですか ?この問題を解決するにはどうすればよいですか? (私は GHC 7.6.3 を使用しています)

4

1 に答える 1

1

ScopedTypeVariables上記のインスタンス ヘッドのものと一致するように、mappend の定義で t1 を取得する必要があります。

また、次の HList リリースには、長さ 2 のレコードに制限されないことを除いて、あなたのように機能する Monoid インスタンスがあります。http://code.haskell.org/HList/Data/HList/HList.hsは実装です(インスタンス forRecordは で記述GeneralizedNewtypeDeriving)

于 2014-07-15T03:10:11.430 に答える