次のタイプを考慮して、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
と呼ばれていますか?
手で 'Ord1'を実装する際のヒント?私は 'constructorIndex :: Foo a - > Int'ヘルパーのようなものを考えています。 – nponeccop
@nponeccopこれは、コンストラクタがたくさんある場合に役立ちます。あなたの 'Foo'のような小さなものについては、あなたの' Eq1'インスタンスと同様の方法でそれをやります。 '比較'の面で: 'バー'対 'バズ'は 'LT'を与える。 'Baz'と' Bar'は 'GT'を与えます。 'Bar'と' Bar'の文字列を比較すると、 'Baz'と' Baz'では頭を比較し、頭を比較すれば尾が 'EQ'を出します。 – duplode
まあ、[実際のタイプ](https://github.com/ptol/oczor/blob/4e400dfcf54e1b3a8de9d3bbf13b6c5f70a3ec15/src/Oczor/Syntax/TypesF.hs#L48)には11のコンストラクタがあります。 – nponeccop