在Haskell中有Hask,其中的对象是Haskell类型,而态性是Haskell函数。但是,functor
type类有一个函数fmap
,它在这些类型(因此是对象而不是类别本身)之间进行映射:
fmap :: (a -> b) -> f a -> f b
f a
和f b
都是HASK中的对象。这是否意味着Haskell中functor
的每个实例都是一个内函数,如果不是,functor
真的表示一个函数吗?
functor
的实例指定了两件事:类型构造函数F
*->*
,即从Hask对象到Hask对象的映射;类型函数(a->b)->(fa->fb)
,即从Hask箭头到与对象映射F
兼容的Hask箭头的映射。因此,是的,functor
的所有实例都是内函数。有几种关于黑客攻击的通用方法,例如control.categorical.functor。
我知道Haskell中的许多名字都是受到范畴理论术语的启发,我正试图准确地理解类比的起点和终点。 我已经知道由于一些关于严格/懒惰和的技术细节,不(一定)是一个类别,但现在让我们先把那个放在一边。为了清楚起见, 的对象是具体类型,即kind的类型。这包括像这样的函数类型,但不包括像这样需要类型参数的函数类型。但是,具体类型属于。类型构造函数/多态函数更像是自然转换(或从到自身的其他更一般的映射),
从范畴理论的角度来看,这个答案包括以下陈述: ...事实是co和逆变函子之间没有真正的区别,因为每个函子都是协变函子。 更详细地说,从C类到D类的逆变函子F无非是F型的(协变)函子:COP→D,从C的相反类到D类。 另一方面,Haskell的和仅要求分别为实例定义和。这表明,从Haskell的角度来看,存在但不是的对象(反之亦然)。 因此,在范畴理论中,似乎“co和逆变函子之间没有真正的区别”,而
现在考虑一个成员类型为的typeclass。例如,可以想象一个类型类,它对应于组的类别(从技术上讲,是的子类别,其对象包含Haskell的所有类型)。概括: 问题2:Haskell中每个成员类型为的typeclass是否都对应于某个类别(从技术上讲:的某个子类别)? 由此可以提出下一个一般性问题: 一般问题:每一个Haskell类型类是否都对应于某种范畴理论的概念? Edit:至少,您可以说,由于
Haskell中的函子是一种可以映射不同类型的函数表示。它是实现多态性的高级概念。根据Haskell开发人员,列表、映射、树等所有类型都是Haskell函数的实例。 函子是一个内建的类,它的函数定义类似 − 根据这个定义,可以得出这样的结论:Functor是一个函数,它接受一个函数,比如,然后返回另一个函数。在上面的例子中,是函数的一种通用表示。 在下面的示例中,我们将看到Haskell Func
我用递归函数在Haskell中实现一些数论函数的幂运算。我正在使用QuickCheck库来测试我的实现。为了简化我的测试,我使用了基库中的Natural数据类型,在quickcheck-instances库中定义的Natural任意实例,以及以下从Nat转换到Natural和从Natural转换到Nat的函数,考虑的是我自己定义的数据Nat: 在自然数上使用以下递归: 我的幂函数是
作为一个Haskell新手,我不明白为什么表达式抛出异常和函数组合必须与运算符一起应用-它右边的表达式不需要进一步计算,因为它只是一个。编译它的另一种方法是将在括号中,但是与,那么为什么把它放在括号中可以编译表达式呢?