11

最近、カタモルフィズムをやっと理解できた気がする。私は最近の回答でそれらについていくつか書きましたが、簡単に言うと、その型の値を再帰的にトラバースするプロセスを抽象化した型のカタモルフィズムであり、その型のパターン一致は、型が持つコンストラクターごとに 1 つの関数に具体化されます。 . この点または上記のリンクの私の回答の長いバージョンの修正を歓迎しますが、これは多かれ少なかれダウンしていると思います。それはこの質問の主題ではなく、いくつかの背景です。

カタモルフィズムに渡す関数が型のコンストラクターに正確に対応し、それらの関数の引数が同様にそれらのコンストラクターのフィールドの型に対応していることに気付くと、すべてが突然非常に機械的に感じられ、どこにあるのかわかりません代替実装のための小刻みの余地。

たとえば、私はこのばかげたタイプをでっち上げましたが、その構造が「意味する」ことについての実際の概念はなく、カタモルフィズムを導き出しました。この型の汎用的な折り畳みを定義できる方法は他にありません。

data X a b f = A Int b
             | B
             | C (f a) (X a b f)
             | D a

xCata :: (Int -> b -> r)
      -> r
      -> (f a -> r -> r)
      -> (a -> r)
      -> X a b f
      -> r
xCata a b c d v = case v of
  A i x -> a i x
  B -> b
  C f x -> c f (xCata a b c d x)
  D x -> d x

私の質問は、すべての型に一意のカタモルフィズムがありますか (引数の並べ替えまで)? それとも、反例がありますか: カタモルフィズムを定義できないタイプ、または 2 つの異なるが同等に合理的なカタモルフィズムが存在するタイプ? 反例がない場合 (つまり、型のカタモルフィズムが一意であり、自明に派生可能である場合)、GHC に、この厄介な作業を自動的に行うある種の型クラスを派生させることは可能ですか?

4

2 に答える 2