在向某人解释什么是类型类X时,我很难找到正好是X的数据结构的好例子.
所以,我请求示例:
我认为Monad到处都有很多例子,但Monad的一个很好的例子与之前的例子有一些关系可以完成图片.
我寻找彼此相似的示例,区别仅在于属于特定类型类的重要方面.
如果有人能够设法在这个层次结构的某个地方隐藏一个Arrow的例子(它是在Applicative和Monad之间吗?),那也会很棒!
从分类的角度来看,仿函数是一对两个映射(一个在对象之间,另一个在类别的箭头之间),遵循一些公理.
我假设,每个Functor实例与数学定义类似,即可以映射对象和函数,但Haskell的Functor类只有fmap映射函数的函数.
为什么这样?
UPD换句话说:
每个Monad类型M都有一个功能return :: a -> M a.
Functor类型F没有功能return :: a -> F a,只有F x构造函数.
阅读了这本书,了解了一本Haskell For Great Good,以及非常有用的维基书籍Haskell分类理论帮助我克服了将类别对象与编程对象混淆的常见类别错误,我仍然有以下问题:
为什么必须fmap映射List的每个元素?
我喜欢它,我只想理解这在理论上是如何合理的.(或者更容易证明使用HoTT?)
在Scala表示法中,List是一个仿函数,它接受任何类型并将其映射到所有列表类型集合中的类型,例如,它将类型映射Int到类型List[Int],并将函数映射到Int例如
Int.successor: Int => Int 至 Functor[List].fmap(successor) : List[Int] => List[Int]Int.toString: Int => String 至 Functor[List].fmap(toString): List[Int] => List[String]现在每个实例List[X]都是一个带有empty函数(mempty在Haskell中)和combine函数(mappend在Haskell中)的monoid .我的猜测是,人们可以使用列表是Monoids的事实,以表明map必须映射列表的所有元素.我的感觉是,如果添加了pureApplicative的函数,这给了我们一个只包含其他类型元素的列表.例如Applicative[List[Int]].pure(1) == List(1).因为map(succ)在这些元素上给我们带有下一个元素的单例列表,所以这涵盖了所有这些子集.然后我想combine所有这些单身人士的功能都会给我们列出所有其他元素.不知怎的,我想这限制了地图的工作方式.
另一个暗示性的论点是map必须在列表之间映射函数.由于a中的每个元素List[Int]都是Int类型,并且如果一个映射到List[String]一个元素必须映射它的每个元素,或者一个元素不是正确的类型.
所以这两个论点似乎都指向了正确的方向.但我想知道剩下的方式需要什么.
反例? …
在Haskell中,该类Functor声明为:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
可以输入变量a和b是函数类型,或者他们必须是非功能类型?
如果它们可以是函数类型,那么就可以使类应用于具有任意数量的参数的函数而言,类是否与class Functor有效地相同?根据赫顿在《 Haskell编程》中所说:Applicativefmap
函子抽象了
fmap将功能映射到结构的每个元素上的想法 。应用程序将此想法概括为允许fmap映射具有任意数量参数的映射函数,而不是仅限于具有单个参数的函数。
适用:
Run Code Online (Sandbox Code Playgroud)fmap0 :: a -> f a fmap0 = pure fmap1 :: (a -> b) -> f a -> f b fmap1 g x = pure g <*> x fmap2 :: (a -> b -> c) -> f a -> f b -> …
在范畴论中,函子是范畴之间的态射,即将范畴中的每个对象映射A到 中的另一个对象B,并将每个态射映射C -> D到 中的各个对象B,同时保留态射的组合。因此,我们可以说函子由两个“部分”组成,一个将对象映射到对象,另一个将态射映射到态射。在Haskell中,如果我理解正确的话,Functor类型类中的每个类型都可以“映射到”,即类型的函数a -> b可以映射到函数上F a -> F b。现在为什么不存在return :: Functor f => a -> f a专门用于 的函数Functor?是否没有必要,因为我们可以简单地利用实例return中的定义Monad,因为 return 实际上只对 Monad 的函子部分起作用,还是还有其他原因?
这让我觉得很奇怪,因为如果真是这样,为什么不return包含在Functor实例中?我的意思是每个单子都有一个函子部分,所以对我来说,这是有道理的。有人能在这方面启发我吗?