1. ホーム

[解決済み】Not a Functor/Functor/Applicative/Monadの良い例?

2022-04-08 22:57:03

質問

型クラスXが何であるかを誰かに説明するとき、まさにXであるデータ構造の良い例を見つけるのに苦労しています。

そこで、私は次のような例をリクエストしています。

  • ファンクターでないタイプコンストラクタ。
  • ファンクターでありながら、Applicativeではないタイプ・コンストラクター。
  • Applicative でありながら Monad ではないタイプコンストラクタ。
  • モナドであるタイプ・コンストラクタ。

モナドの例はどこにでもあると思いますが、これまでの例と何らかの関連性を持ったモナドの良い例があれば、絵が完成すると思います。

私は、特定の型クラスに属するために重要な側面だけが異なる、互いに似たような例を探しています。

もし、この階層のどこか(ApplicativeとMonadの間?)にArrowの例を忍ばせることができたら、それも素晴らしいことですね。

どのように解決するのか?

ファンクターでないタイプ・コンストラクター。

newtype T a = T (a -> Int)

これでcontravariant functorは作れるが、(covariant)functorは作れない。 試しに fmap で、失敗します。 なお、contravariant functorの方は逆になっています。

fmap      :: Functor f       => (a -> b) -> f a -> f b
contramap :: Contravariant f => (a -> b) -> f b -> f a

ファンクタでありながら、Applicativeではないタイプコンストラクタ。

いい例がないんです。 あるのは Const しかし、理想を言えば、Monoid以外の具体的なものが欲しいのですが、思いつきません。 どの型も基本的には数値、列挙、積、和、関数と突き詰めればきりがない。 下記のpigworkerと私の意見の相違をご覧ください。 Data.VoidMonoid ;

instance Monoid Data.Void where
    mempty = undefined
    mappend _ _ = undefined
    mconcat _ = undefined

以降 _|_ はHaskellでは合法な値であり、実際、唯一の合法的な値である Data.Void これはMonoidの規則に合致しています。 私は、どのような unsafeCoerce を使用した時点で、プログラムがHaskellのセマンティクスに違反しないことが保証されなくなるからです。 unsafe 関数を使用します。

bottomに関する記事はHaskell Wikiをご覧ください( リンク ) や安全でない関数 ( リンク ).

AgdaやHaskellのようなリッチな型システムを使って、このような型コンストラクタを作ることは可能なのだろうかと思います。

ApplicativeでありながらMonadでない型構成子。

newtype T a = T {multidimensional array of a}

みたいな感じで、Applicativeを作ることができます。

mkarray [(+10), (+100), id] <*> mkarray [1, 2]
  == mkarray [[11, 101, 1], [12, 102, 2]]

でも、モナドにすると、次元の不一致が起きるかもしれない。 実際にはこのような例は少ないのではないでしょうか。

モナドである型構成子。

[]

アローズについて

アローがこの階層のどこに位置するかを問うことは、quot;red"がどのような形状であるかを問うようなものである。 種類の不一致に注意してください。

Functor :: * -> *
Applicative :: * -> *
Monad :: * -> *

が、です。

Arrow :: * -> * -> *