为了账号安全,请及时绑定邮箱和手机立即绑定

不是Functor / Functor / Applicative / Monad的好例子?

不是Functor / Functor / Applicative / Monad的好例子?

不是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。滚动你自己。

飞机赶上......


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 372 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信