我对范畴理论的知识不是很好。所以请容忍我。
我一直在读
看到了下面的定义。
class (Category c, Category d) => Functor c d t where
fmap :: c a b -> d (t a) (t b)
我从那个网站上读到,Haskell前奏曲中的函子类型实际上是一个内函子。(上述类别中的C及d类均为Hask)
读完这一页后,我想知道。如果Haskell使用的是实数函子而不仅仅是内函子,它会更适合元编程吗?
假设我们有以下内容( Js代表Javascript)
data Js a where
litInt :: Integer -&
在Haskell中,函子类型函子的定义如下(例如,见哈斯克尔维基):
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
据我所知(如果我错了请纠正我),这样的函子只能有一个用类型构造函数(如[]、Maybe等)构造的范畴作为目标范畴。另一方面,人们可能认为函子的任何范畴都是函子的目标,例如所有类型的范畴。例如,Int可以是函子目标类别中的对象,而不仅仅是Maybe Int或[Int]。
Haskell函子受到这种限制的动机是什么?
据我所知,函子是两个类别之间的映射,例如
中的对象
哪里
和
都是类别。
在Haskell中有Hask,其中对象是Haskell类型,而态射是Haskell函数。但是,Functor类型类有一个函数fmap,它在这些类型之间映射(因此是对象,而不是类别本身):
fmap :: (a -> b) -> f a -> f b
f a和f b都是Hask中的对象。这是否意味着Haskell中的每个Functor实例都是一个函数,如果不是,Functor是否真的表示一个函子?
我在这里错过了什么?类型也在Haskell中吗?
在范畴理论中,单元可以由两个伴随函子构成。特别是,如果C和D是范畴,F:C --> D和G:D->C是伴随函子,即存在双射。
hom(FX,Y) = hom(X,GY)
对于C中的每个X和D中的Y,则组成G:C->C是一个单模。
一个这样的伴随函子可以通过固定一个类型的b并取F和G来给出。
data F b a = F (a,b)
data G b a = G (b -> a)
instance Functor (F b) where
fmap f (F (a,b)) = F (f a, b)
instance Functor (G b) where
THis是关于facebook open graph的一个非常新手的问题。我完成了这个教程,并且可以使用新的动词和新的名词创建新的命名空间。然而,我不能让像对象这样的简单对象工作...
不管怎样,这是我所做的一切的结果。
当我尝试执行像facebook的open graph这样的自定义内置时,我得到了以下错误:
Object
error: Object
code: 1611072
message: "The action you're trying to publish is invalid because it does not specify any reference o
我正试图使Monad的绝对定义与我在其他一些教程/书籍中看到的其他一般表示/定义相一致。
下面,我正在(也许是有力地)试图把这两个定义联系起来,请指出错误,并在需要时提供更正。
所以从Monad的定义开始
单子只是内函子范畴中的一元。
只要稍微了解一下内射函数,我就认为Monad可以写成
((a->b)->Ma->Mb)->((b->c)->Mb->Mc)
LHS的'Type‘(左手边)是Mb,而RHS的类型是Mc,所以我想我可以按下面的方式写它
Mb-> (b->c)-> Mc, **which is how we
下面是代码片段,&main和&user在这里描述了什么?每次我跑,为什么它会给出不同的价值?在哪些情况下传递&function_name是有用的?
int user()
{
return 0;
}
int main()
{
int a, b = 0;
a = ((int)&main);
b = ((int)&user);
cout << a <<" " << b;
return 0;
}
从范畴的角度来看,函子是两个映射对(一个在对象之间,另一个在类别的箭头之间),遵循一些公理。
我假设,每个函子实例都类似于数学定义,即可以同时映射对象和函数,但是Haskell的Functor类只有映射函数的函数fmap。
为什么会这样呢?
换句话说,UPD:
每个Monad类型的M都有一个函数return :: a -> M a。
而函子类型F没有函数return :: a -> F a,只有F x构造函数。
引用N M Jousttis 5.9节“C++标准库”的话
#include < iostream>
#include < list>
#include < algorithm>
using namespace std;
//function object that adds the value with which it is initialized
class AddValue {
private:
int the Value; //the value to add
public:
//construct