适用于Monoidal Functor:
mappend :: f -> f -> f
$ :: (a -> b) -> a -> b
<*> :: f(a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
但是我没有在应用类型类的定义中看到有关Monoid的任何参考,你能告诉我为什么吗?
定义:
class Functor f => Applicative (f :: * -> *) where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
GHC.Base.liftA2 :: (a -> b -> c) -> f a -> f b -> f c
(*>) :: f a …Run Code Online (Sandbox Code Playgroud) 据我明白,从Haskell的递归数据类型对应于endofunctors的初始代数从Hask类别[ 1,2 ].例如:
data Nat = Zero | Succ Nat对应于endofunctor的初始代数F(-) = 1 + (-).data List a = Nil | Cons a (List a)对应于endofunctor的初始代数F(A, -) = 1 + A × (-).但是,我不清楚对应玫瑰树的endofunctor应该是什么:
data Rose a = Node a (List (Rose a))
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,有两个递归:一个用于玫瑰树,另一个用于列表.根据我的计算,我会得到以下仿函数,但它似乎不正确:
F(A, •, -) = A × (1 + (-) × (•))
Run Code Online (Sandbox Code Playgroud)
或者,可以将玫瑰树定义为相互递归的数据类型:
data Rose a = Node a (Forest a)
type Forest a = List (Rose …Run Code Online (Sandbox Code Playgroud) recursion haskell algebra algebraic-data-types category-theory
考虑一个类型类,其成员类型* -> *.例如:Functor类型类.众所周知,在Haskell中,这种类型类与其数学(即类别理论)类似物之间存在对应关系.归纳:
问题1: Haskell中每个成员都是类型的每个类型类都* -> *对应于类别之间的某些功能吗?
现在考虑一个类型为类型的类型类*.例如,可以想象一个类型类Group对应于组的类别(从技术上讲,Group它将是Hask其对象包含所有Haskell类型的子类别).归纳:
问题2: Haskell中每个成员类型的类型类是否*对应于某个类别(技术上:某些子类别Hask)?
由此,可以问下一个一般性问题:
问题3:类型的类型是否等于或高于* -> * -> *某些类别理论概念?
实际上,整个问题可归纳如下:
一般问题:每个Haskell类型类都对应于某种类别的理论概念吗?
编辑:至少,似乎你可以说,因为每个类型类都包含一些Haskell类型作为其成员,你可以将每个类型类视为一些子类Hask(关闭.和利用id).