不是Functor / Functor / Applicative / Monad的好例子?在向某人解释什么是类型类X时,我很难找到正好是X的数据结构的好例子。所以,我请求示例:一个不是Functor的类型构造函数。一个类型构造函数,它是一个Functor,但不是Applicative。一个类型构造函数,它是Applicative,但不是Monad。Monad的类型构造函数。我认为Monad到处都有很多例子,但Monad的一个很好的例子与之前的例子有一些关系可以完成图片。我寻找彼此相似的示例,区别仅在于属于特定类型类的重要方面。如果有人能设法在这个层次结构的某个地方隐藏一个Arrow的例子(在Applicative和Monad之间吗?),那也很棒!
3 回答
智慧大石
TA贡献1946条经验 获得超3个赞
我的手机可能会让我的风格变得狭窄,但是现在这样。
newtype Not x = Kill {kill :: x -> Void}
不能是一个Functor。如果是,我们就有
kill (fmap (const ()) (Kill id)) () :: Void
月亮将由绿色奶酪制成。
与此同时
newtype Dead x = Oops {oops :: Void}
是一个算子
instance Functor Dead where fmap f (Oops corpse) = Oops corpse
但不能适用,或者我们有
oops (pure ()) :: Void
和格林将由月亮奶酪制成(实际上可以发生,但只能在晚上)。
(额外注意:Void
,因为Data.Void
是一个空的数据类型。如果你试图undefined
证明它是一个Monoid,我会unsafeCoerce
用来证明它不是。)
欢悦,
newtype Boo x = Boo {boo :: Bool}
在很多方面是适用的,例如Dijkstra会有的,
instance Applicative Boo where pure _ = Boo True Boo b1 <*> Boo b2 = Boo (b1 == b2)
但它不能是Monad。要明白为什么不这样做,请注意返回必须是持续的,Boo True
或者Boo False
因此
join . return == id
不可能举行。
哦,是的,我差点忘了
newtype Thud x = The {only :: ()}
是Monad。滚动你自己。
飞机赶上......
添加回答
举报
0/150
提交
取消