我仍然熟悉所有这些类别理论的东西,而且我看到的每个例子都是使用Maybe或Array。但我还没有找到任何区分这些类别的例子。例如,以下是我仍然无法回答的一些问题:
我通过JavaScript FantasyLand的语境学习这些东西,以便我从中获取语言 - 我知道这些东西有不同的词。
答案 0 :(得分:8)
仙人掌给出了一个不是幺半群的半群的很好的例子。任何类型的非空(有限)列表代表该类型上的 free semigroup 。另一个示例是Data.Void.Void
,它不是Monoid
,因为它没有任何元素,因此没有标识元素。另一个例子是添加的正整数集。
不是Functor
的{{1}} Apply
为Handler
。
data Handler a where
Handler :: Exception e => (e -> IO a) -> Handler a
instance Functor Handler where
fmap f (Handler h) = Handler (\e -> f <$> h e)
鉴于Handler f :: Handler (a -> b)
和Handler g :: Handler a
,您有
f :: e1 -> IO (a -> b)
g :: e2 -> IO a
e1
和e2
是(可能不同的)异常类型。您需要为某些例外类型h :: e3 -> IO b
创建e3
。没有真正明智的方法来做到这一点**。
似乎更难找到Functor
无法成为守法Apply
实例,因为Apply
只有一个法则,因此承认Applicative
拒绝的各种奇怪的事情。
Map k
和IntMap
。此外,(,) a
和Const a
当a
是Semigroup
但不是Monoid
时。同样,其他一些类型符合接受Apply
和/或Bind
的弱上下文的模式,而不是Applicative
或Monad
。
ZipList
是Apply
,但不是Bind
。我不知道Chain
是什么。
**一种半合理的方式可能如下:
data P x y = P x y deriving (Show, Typeable)
instance (Exception x, Exception y) =>
Exception (P x y)
instance Apply Handler where
Handler f <.> Handler g =
Handler (\(P e1 e2) -> f e1 <*> g e2)
我认为这符合Apply
法律,但我还不完全确定。
答案 1 :(得分:3)
非空列表,定义为data NEList a = Cons a [a]
是半群,但不是幺半群。