在阅读各种关于函数式编程的文章时,我遇到过几次“Functor”这个术语,但作者通常认为读者已经理解了这个术语。在网络上你可以看到一些过于技术性的描述(参见维基百科的文章),也可以看到一些非常模糊的描述(参见ocaml-tutorial网站上关于函数函数的部分)。
有没有人可以定义这个术语,解释它的用法,或者提供一个如何创建和使用函子的例子?
编辑:虽然我对这个术语背后的理论很感兴趣,但我对这个概念的实现和实际应用更感兴趣,而不是理论。
编辑2:看起来好像有一些交叉术语:我特别指的是函数式编程的函子,而不是c++的函数对象。
在投票最多的答案下,网友Wei Hu问道:
我理解ml -函子和haskell -函子,但缺乏
将它们联系在一起的洞察力。这两者之间是什么关系
二,在分类理论的意义上?
注:本人不懂ML,如有错误请见谅。
让我们首先假设我们都熟悉“范畴”和“函子”的定义。
一个紧凑的答案是,“haskell -函子”是(endo-)函子F: Hask -> Hask,而“ML-函子”是函子G: ML- > ML'。
这里,Hask是由Haskell类型和它们之间的函数组成的类别,类似地,ML和ML'是由ML结构定义的类别。
注意:将Hask作为一个类别存在一些技术问题,但有一些方法可以绕过它们。
从范畴论的角度来看,这意味着hask -函子是Haskell类型的映射F:
data F a = ...
伴随着Haskell函数的map fmap:
instance Functor F where
fmap f = ...
ML是差不多的,尽管我不知道有一个规范的fmap抽象,所以让我们定义一个:
signature FUNCTOR = sig
type 'a f
val fmap: 'a -> 'b -> 'a f -> 'b f
end
f映射ml -类型fmap映射ml -函数
functor StructB (StructA : SigA) :> FUNCTOR =
struct
fmap g = ...
...
end
是一个函子F: StructA -> StructB。