所以我们有Hask类别,其中:
同样Functor我们有:
fmap 用于将态射从一个类别映射到另一个类别.现在,当我们编写程序时,我们基本上会转换值(而不是类型),似乎Hask的类别根本不讨论值.我试图在整个等式中拟合值,并得出以下观察结果:
Int -> Int现在我的问题是 - 在Hask类别(或一般类别理论)中,值是否有意义?如果是,那么任何关于它的参考或如果没有,那么任何原因.
我希望这个问题有道理:)
阅读这篇关于Haskell和类别理论基础知识的Wikibook,我学习了Functors:
仿函数本质上是类别之间的转换,因此给定类别C和D,仿函数F:C - > D.
将C中的任何对象A映射到D中的F(A).
映射态射f:A - > B在C到F(f):F(A) - > F(B)在D.
......听起来很不错.后来提供了一个例子:
我们也有一个示例实例:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap _ Nothing = Nothing
Run Code Online (Sandbox Code Playgroud)
这是关键部分:类型构造函数可能将任何类型T转换为新类型,也许T.此外,fmap仅限于Maybe类型需要函数a - > b函数可能a - >可能b.但就是这样!我们已经定义了两个部分,一部分将Hask中的对象转换为另一个类别中的对象(Maybe类型和函数在Maybe类型上定义),以及将Hask中的态射视为此类别中的态射的东西.所以也许是一个算子.
我理解定义fmap是关键的.我很困惑"类型构造函数Maybe"如何提供第一部分.我宁愿期待类似的东西pure.
如果我做对了,Maybe而不是映射C到D.(因此是类别级别的态射,这可能是Functor的要求)
我想你可以像这样重新解释我的问题:是否有一个没有明显实现的Functor pure?
在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实例中?我的意思是每个单子都有一个函子部分,所以对我来说,这是有道理的。有人能在这方面启发我吗?