Functor ではない型コンストラクタ:
newtype T a = T (a -> Int)
それから反変ファンクターを作成できますが、(共変) ファンクターは作成できません。書いてみてくださいfmap
、失敗します。反変ファンクターのバージョンが逆になっていることに注意してください。
fmap :: Functor f => (a -> b) -> f a -> f b
contramap :: Contravariant f => (a -> b) -> f b -> f a
ファンクタであるがApplicativeではない型コンストラクタ:
いい例がありません。ありますがConst
、理想的には具体的な非モノイドが欲しいのですが、何も思いつきません。すべての型は基本的に、数値、列挙、積、合計、または関数です。以下の pigworker を見ることができData.Void
ますMonoid
。
instance Monoid Data.Void where
mempty = undefined
mappend _ _ = undefined
mconcat _ = undefined
_|_
は Haskell の正当な値であり、実際には の唯一の正当な値であるためData.Void
、これはモノイド規則を満たしています。unsafeCoerce
関数を使用するとすぐに、プログラムがHaskellセマンティクスに違反しないことが保証されなくなったため、それと何の関係があるのか わかりませんunsafe
。
下部 (リンク) または安全でない関数 (リンク)に関する記事については、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]]
しかし、モナドにすると、次元の不一致が発生する可能性があります。このような例は、実際にはまれであると思います。
モナドである型コンストラクタ:
[]
矢印について:
矢印がこの階層のどこにあるかを尋ねることは、「赤」がどのような形であるかを尋ねるようなものです。種類の不一致に注意してください。
Functor :: * -> *
Applicative :: * -> *
Monad :: * -> *
しかし、
Arrow :: * -> * -> *