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

不是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 回答

?
呼如林

一个不是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

一个类型构造函数,它是一个函子,但不适用于:

我没有一个很好的例子。有Const,但理想情况下,我想要一个具体的非Monoid,我想不出任何。当您开始使用时,所有类型基本上都是数字,枚举,产品,总和或函数。你可以看到下面的pigworker,我不同意是否Data.Void是一个Monoid;

instance Monoid Data.Void where
    mempty = undefined
    mappend _ _ = undefined
    mconcat _ = undefined

既然_|_是Haskell的合法价值,实际上是唯一的合法价值Data.Void,那么这符合Monoid规则。我不确定unsafeCoerce它与它有什么关系,因为你的程序不再保证在你使用任何unsafe函数时都不会违反Haskell语义。

有关底部(链接)或不安全函数(链接)的文章,请参阅Haskell Wiki 。

我想知道是否可以使用更丰富的类型系统创建这样的类型构造函数,例如具有各种扩展的Agda或Haskell。

一个类型构造函数,它是Applicative,但不是Monad:

newtype T a = T {multidimensional array of a}

您可以使用以下内容制作应用程序:

mkarray [(+10), (+100), id] <*> mkarray [1, 2]
  == mkarray [[11, 101, 1], [12, 102, 2]]

但如果你把它变成monad,你可能会得到尺寸不匹配。我怀疑这样的例子在实践中很少见。

Monad的类型构造函数:

[]

关于箭头:

询问箭头在这个层次结构上的位置就像问什么样的形状“红色”。注意种类不匹配:

Functor :: * -> *Applicative :: * -> *Monad :: * -> *

但,

Arrow :: * -> * -> *


查看完整回答
反对 回复 2019-08-06
?
慕少森

我相信其他答案错过了一些简单而常见的例子:

一个类型构造函数,它是一个Functor但不是Applicative。一个简单的例子是一对:

instance Functor ((,) r) where
    fmap f (x,y) = (x, f y)

但是如何在Applicative不对其施加额外限制的情况下定义其实例是没有办法的r。特别是,没有办法如何定义pure :: a -> (r, a)任意的r

一个类型构造函数,它是Applicative,但不是Monad。一个众所周知的例子是ZipList。(这是一个newtype包装列表并Applicative为它们提供不同的实例。)

fmap以通常的方式定义。但pure<*>被定义为

pure x                    = ZipList (repeat x)ZipList fs <*> ZipList xs = ZipList (zipWith id fs xs)

因此,pure通过重复给定值来创建无限列表,并使用值<*>列表压缩函数列表 - 将i -th函数应用于第i个元素。(标准<*>on []产生了将第i个函数应用于第j个元素的所有可能组合。)但是没有明智的方法来定义monad(参见这篇文章)。


箭头如何适应functor / applicative / monad层次结构? 看到成语是不经意的,箭头是一丝不苟的,单身是由Sam Lindley,Philip Wadler,Jeremy Yallop混淆的。MSFP 2008.(他们称之为applicative functors 成语。)摘要:

我们重新审视了三个计算概念之间的联系:Moggi的monad,Hughes的箭头和McBride和Paterson的习语(也称为applicative functors)。我们证明成语相当于满足类型同构A~> B = 1~>(A - > B)的箭头,并且monad相当于满足类型同构的箭头A~> B = A - >(1~ > B)。此外,成语嵌入箭头和箭头嵌入monad。


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

添加回答

回复

举报

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