Un constructeur de type qui n'est pas un Foncteur:
newtype T a = T (a -> Int)
Vous pouvez faire un cofunctor, mais pas un foncteur. Essayez d'écrire fmap
et vous allez échouer. Notez que le cofunctor version est inversé:
fmap :: Functor f => (a -> b) -> f a -> f b
cofmap :: Cofunctor f => (a -> b) -> f b -> f a
Un constructeur de type, qui est un foncteur, mais pas Applicative:
Je n'ai pas un bon exemple. Il est Const
, mais, idéalement, j'aimerais un béton non-Monoïde et je ne peux pas penser à tout. Tous les types sont essentiellement numériques, des énumérations, des produits, des sommes ou des fonctions lorsque vous descendez à elle. Vous pouvez voir ci-dessous pigworker et j'en désaccord quant à savoir si Data.Void
est Monoid
;
instance Monoid Data.Void where
mempty = undefined
mappend _ _ = undefined
mconcat _ = undefined
Depuis _|_
est une valeur juridique en Haskell, et en fait, la seule valeur juridique d' Data.Void
, cela correspond à l'Monoïde règles. Je suis pas sûr de ce qu' unsafeCoerce
a à faire avec elle, parce que votre programme n'est plus garanti de ne pas violer Haskell sémantique dès que vous utilisez un unsafe
fonction.
Voir le Haskell Wiki pour un article sur le fond (lien) ou dangereux fonctions (lien).
Je me demande si il est possible de créer un tel type de constructeur à l'aide d'un riche système de type, comme les Agda ou Haskell avec diverses extensions.
Un constructeur de type, qui est un Applicative, mais pas une Monade:
newtype T a = T {multidimensional array of a}
Vous pouvez faire un Applicative hors de lui, avec quelque chose comme:
mkarray [(+10), (+100), id] <*> mkarray [1, 2]
== mkarray [[11, 101, 1], [12, 102, 2]]
Mais si vous en faites une monade, vous pourriez obtenir une dimension l'inadéquation. Je soupçonne que des exemples de ce genre sont rares dans la pratique.
Un constructeur de type, qui est une Monade:
[]
À Propos De Flèches:
Demandant où une Flèche se trouve sur cette hiérarchie, c'est comme demander quel genre de forme "rouges". Remarque le type de discordance:
Functor :: * -> *
Applicative :: * -> *
Monad :: * -> *
mais,
Arrow :: * -> * -> *