唯一の `FlippyFloppyMorphism`` const mempty`ですか?
Haskellでは、f :: * -> *同時にaFunctorとaである型コンストラクターContravariantは、その型パラメーターでファントムであるという興味深い事実があります。
phantom :: (Functor f, Contravariant f) => f x -> f y
別の言い方をすれば、同時にFunctorsとaであるすべての型コンストラクターは、一部のについてContravariantは、自然にと同型であるということです。Const xx
これは、クラスをインスタンス化するための「唯一の」方法(同型まで)を意味します。
class FlippyFloppyFunctor f
where
ffmap :: Either (y -> x) (x -> y) -> f x -> f y
ファンクターの法則に従うように:
ffmap (Left id) = id
ffmap (Right id) = id
ffmap (Left (g . f)) = ffmap (Left f) . ffmap (Left g)
ffmap (Right (f . g)) = ffmap (Right f) . ffmap (Right g)
は:
weirdmap :: Either (y -> x) (x -> y) -> Const r x -> Const r y
weirdmap = const $ \(Const x) -> Const x
つまり、モジュロニュータイプ、const id。
これが制約を満たすタイプの唯一の関数である理由を理解するのは難しいと思いますが、そのようなマップの存在がファンクターがそのタイプに「ファントム」であることを意味する理由についてabsurd :: Void -> a/discard :: a -> ()を含むさまざまな非公式の議論を理解することはできますパラメータ。
それをよりよく理解するために、私は問題を単純化しようとしました。について考える代わりに、考えてFlippyFloppyFunctorみましょう:
class (Monoid a, Monoid b) => FlippyFloppyMorphism a b
where
ffmorph :: Either a a -> b
類似の法則で:
ffmorph (Left mempty) = mempty
ffmorph (Right mempty) = mempty
ffmorph (Left (y <> x)) = ffmorph (Left x) <> ffmorph (Left y)
ffmorph (Right (x <> y)) = ffmorph (Right x) <> ffmorph (Right y)
仮定するaと、b 非可換モノイドあり、唯一の合法的な実装があることまだ本当ですFlippyFloppyMorphismかconst mempty?参照するaVoidまたはa()がなくても、入力モノイドでモルフィズムが「ファントム」でなければならない理由を説明することはまだ可能ですか?
回答
モノイドは可換である可能性があるため、一般的な場合の答えは「いいえ」であるように私には思えます。
モノイドが可換である場合、はとDual a同じモノイドでありa、とEither a a同じaであるためffmorph、が唯一のモノイド準同型であるかどうかを尋ねるだけa -> bです。答えはいいえだ"。
たとえば、加算の可換モノイドの場合、次のようreplicate 'a' :: Either (Sum Int) (Sum Int) -> Stringになります。
replicateA (Left 0) = ""
replicateA (Right 0) = ""
replicateA (Left (y + x)) = replicateA (Left x) ++ replicateA (Left y)
replicateA (Right (x + y)) = replicateA (Left x) ++ replicateA (Left y)
ただし、_non_commutativeモノイドの場合、可能な実装はconst mempty(まだ証明がありません)だけである場合があると思います。