[解決済み】Not a Functor/Functor/Applicative/Monadの良い例?
質問
型クラス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.Void
は
Monoid
;
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 :: * -> * -> *
関連
-
[解決済み] haskellでCharからIntに変換する
-
[解決済み] モナドはエンドファンクタのカテゴリではただのモノイドですが、何か問題でも?
-
[解決済み】Weak Head Normal Formとは何ですか?
-
[解決済み】代数的なデータ型の代数を悪用する - なぜこれが有効なのか?
-
[解決済み】Template Haskellの何がそんなに悪いのか?
-
[解決済み】Haskell: リスト、配列、ベクトル、シーケンス
-
[解決済み】-XAllowAmbiguousTypesはいつが適切ですか?
-
[解決済み】テンプレートHaskellで関連する型の同義語を取得する
-
[解決済み】Haskell の `data` と `newtype` の違いについて
-
[解決済み】Haskell/GHCの`forall`キーワードは何をするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] haskellでCharからIntに変換する
-
[解決済み] Haskellでwhileループに相当する文は何ですか?
-
[解決済み] Haskellの[]と':'とは何ですか?
-
[解決済み] Haskellにおける除算
-
[解決済み】Weak Head Normal Formとは何ですか?
-
[解決済み】代数的なデータ型の代数を悪用する - なぜこれが有効なのか?
-
[解決済み】Haskell: リスト、配列、ベクトル、シーケンス
-
[解決済み】Not a Functor/Functor/Applicative/Monadの良い例?
-
[解決済み】テンプレートHaskellで関連する型の同義語を取得する
-
[解決済み】Haskell の `data` と `newtype` の違いについて