2017-02-24 4 views
4

次のタイプを考慮して、Eq1インスタンスをどのように実装する必要がありますか?Eq1/Ord1タイプクラスの目的とセマンティクス

data Foo a = Bar String | Baz a [a] 

instance Eq1 Foo where 
    liftEq _ (Bar a) (Bar b) = a == b -- can't use f 
    liftEq f (Baz a aa) (Baz b bb) = f a b && liftEq f aa bb -- instance for lists 
    liftEq _ _ _ = False 

上記のインスタンスは正しいですか? GHC 8.0.2で手作業で実装するはずですか? THを使用するderiving-compatライブラリがありますが、それはなぜ-compatと呼ばれていますか?

答えて

2

Eq1や友人の点は型コンストラクタを取る型構成で使用することを意味するもの制約提供している - 例えば、モナド変圧器、またはFix(参照How to derive instances in recursion schemesを) - 必要としないようにして整然とFlexibleContextsまたはUndecidableInstancesなどの拡張機能。

上記のインスタンスは正しいですか?

はい、あります。

私はGHC 8.0.2で手作業で実装する予定ですか?

現在、Eq1のGHC提供の派生はありません。ここにはlibraries mailing list discussion of that matterがあります。

私はそのライブラリも最近GHCsが古いために提供しないインスタンスの導出を提供していますので、「compatのは」単にそこにあると信じてありTHを使用していますderiving-compatライブラリですが、なぜそれが-compat?

と呼ばれていますGHCs。

+0

手で 'Ord1'を実装する際のヒント?私は 'constructorIndex :: Foo a - > Int'ヘルパーのようなものを考えています。 – nponeccop

+0

@nponeccopこれは、コンストラクタがたくさんある場合に役立ちます。あなたの 'Foo'のような小さなものについては、あなたの' Eq1'インスタンスと同様の方法でそれをやります。 '比較'の面で: 'バー'対 'バズ'は 'LT'を与える。 'Baz'と' Bar'は 'GT'を与えます。 'Bar'と' Bar'の文字列を比較すると、 'Baz'と' Baz'では頭を比較し、頭を比較すれば尾が 'EQ'を出します。 – duplode

+0

まあ、[実際のタイプ](https://github.com/ptol/oczor/blob/4e400dfcf54e1b3a8de9d3bbf13b6c5f70a3ec15/src/Oczor/Syntax/TypesF.hs#L48)には11のコンストラクタがあります。 – nponeccop

関連する問題