![]() |
1
259
“函子”一词来源于范畴理论,它是数学中一个非常普遍、非常抽象的分支。功能语言的设计者至少以两种不同的方式借用了它。
像往常一样,人们继续发明新的、有用的抽象概念,你可能想研究一下 应用的 函数,其中最好的参考可能是一篇叫做 Applicative Programming with Effects 作者:康纳·麦克布莱德和罗斯·帕特森。 |
![]() |
2
57
这里的其他答案都是完整的,但我将尝试另一种解释 函子 . 以此为类比:
与C++中使用的抽象函数指针不同,这里的函子是 不 函数;相反,当 服从某种功能 . |
![]() |
3
35
有三种不同的含义,没有太多的关联!
现在,您可以快速添加许多可能的订单、形成新订单的方法、轻松地对它们执行二进制或线性搜索。通用编程FTW。
所以,这是一种特殊的类型构造函数,与ocaml中的函数几乎没有关系!
|
![]() |
4
15
在OCAML中,它是一个参数化模块。 如果你知道C++,想一个OcAML函子作为模板。C++只具有类模板,而函子在模块级工作。
函数的一个例子是map.make;
您不能只使用多态性来实现StringMap之类的功能;您需要对键进行一些假设。字符串模块包含一个完全有序的字符串类型上的操作(比较等),函数将链接字符串模块包含的操作。您可以对面向对象编程执行类似的操作,但是您会有方法间接开销。 |
![]() |
5
13
你有很多好答案。我会参与进来: 在数学意义上,函子是代数上的一种特殊函数。它是将一个代数映射到另一个代数的最小函数。”最小值”用函数定律表示。 有两种方法来看待这个问题。例如,列表是某种类型上的函数。也就是说,给定类型“a”上的代数,您可以生成包含类型“a”的内容的列表的兼容代数。(例如:把一个元素带到包含它的单件列表的映射:f(a)=[a])同样,兼容性的概念由函数定律表示。 另一方面,给出了一个F“over”A型的函子(即,F a是将函子F应用于A型代数的结果),以及G:A->B的函数,我们可以计算出一个新的函子F=(fmap g),它将F a映射到F b。简而言之,fmap是将“functor parts”映射到“functor parts”的f的一部分,G是将“functor parts”映射到“functor parts”的函数的一部分。将“代数部分”映射到“代数部分”。它需要一个函数,一个函数,一旦完成,它也是一个函数。 似乎不同的语言使用了不同的算符概念,但事实并非如此。他们只是在不同的代数上使用函子。ocamls有一个模块代数,代数上的函子允许您以“兼容”的方式将新声明附加到模块上。 Haskell函数不是类型类。它是一个具有满足类型类的自由变量的数据类型。如果您愿意深入研究数据类型的本质(没有自由变量),可以将数据类型重新解释为基础代数上的函数。例如: 数据f=f int 与int类同构。所以f,作为一个值构造函数,是一个将int映射到f int的函数,这是一个等价的代数。它是一个函数。另一方面,你不能在这里免费得到正式消息。这就是模式匹配的目的。 函子有利于以代数兼容的方式将事物“附加”到代数的元素上。 |
![]() |
6
7
在Inria网站上的O'ReillyOCAML书中有一个很好的例子(不幸的是,在写这本书的时候,它已经被删除了)。我在加州理工学院使用的这本书中发现了一个非常相似的例子: Introduction to OCaml (pdf link) . 相关章节是关于函数的章节(书中的第139页,PDF中的第149页)。 在书中,他们有一个名为makeset的函数,它创建一个由列表组成的数据结构,以及添加元素、确定元素是否在列表中以及查找元素的函数。用于确定是否在集合中的比较函数已被参数化(这就是使makeset成为函数而不是模块的原因)。 它们还有一个实现比较函数的模块,以便进行不区分大小写的字符串比较。 使用函数和实现比较的模块,可以在一行中创建新模块:
它为使用不区分大小写比较的集合数据结构创建模块。如果您想要创建一个使用区分大小写比较的集合,那么您只需要实现一个新的比较模块,而不是一个新的数据结构模块。 ToBu比较了C++中的函数和模板,我认为这是非常合适的。 |
![]() |
7
7
对这个问题的最佳答案可以在布伦特·约基的《类型分类》中找到。 Monad Reader的这个问题包含了对函数是什么的精确定义,以及对其他概念的许多定义以及一个图表。(monoid,applicative,monad和其他概念被解释和看到与一个函数有关)。 http://haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf 摘自类型Classopedia的函数: “一个简单的直觉是,一个函数代表了一些 排序,以及将函数均匀地应用于 集装箱 但实际上,整个类型Classopedia是一个高度推荐的阅读,这是令人惊讶的容易。在某种程度上,您可以看到这里呈现的typeclass与对象中的设计模式是平行的,因为它们为您提供了给定行为或能力的词汇表。 干杯 |
![]() |
8
5
这里有一个 article on functors from a programming POV ,然后更具体地说 how they surface in programming languages . 函数的实际使用是在monad中,如果您查找它,可以找到许多monad教程。 |
![]() |
9
5
考虑到其他答案和我现在要发布的内容,我会说这是一个相当严重的超负荷单词,但无论如何… 有关haskell中“functor”一词含义的提示,请咨询ghci:
所以,基本上,haskell中的函数是可以映射的。另一种说法是,函数是一种可以被视为容器的东西,它可以被要求使用给定的函数来转换它所包含的值;因此,对于列表,
The Functor typeclass 小节和小节 Functors, Applicative Functors and Monoids 属于 Learn You a Haskell for Great Good 举例说明这个特殊概念在哪里有用。(小结:很多地方!-)
注意,任何一个单子都可以作为一个函数来处理,事实上,正如CraigStuntz指出的,最常用的函数往往是单子…当然,有时将一个类型作为functor typeclass的实例是很方便的,而不必麻烦将它变成monad。(例如
|
![]() |
10
5
在对投票最高的人的评论中 answer 用户 Wei Hu 问:
注释 :我不知道ML,所以请原谅并纠正任何相关的错误。 我们首先假设我们都熟悉“category”和“functor”的定义。
一个简洁的答案是“haskell函子”是(endo-)函子。
在这里,
注释
:有一些
technical issues
用制造
从范畴理论的角度来看,这意味着
和地图一起
尽管没有规范,但ml几乎是相同的。
那就是
是函子
|
![]() |
11
4
“functor是对象和变形的映射,保留了类别的组合和标识。” 让我们定义什么是类别? < Buff行情>是一堆东西! 在A中画几个点(现在2个点,一个是“A”,另一个是“B”)。 立即圈出并命名该圆圈A(类别)。 < /块引用> 这个类别是什么? < Buff行情>每个对象的对象和标识函数之间的组合。 < /块引用> 因此,在应用函数之后,我们必须映射对象并保留组合。
假设“a”是我们的类别,它有对象[“a”、“b”],并且存在一个变形a->b。 现在,我们必须定义一个函数,它可以将这些对象和变形映射到另一个类别“b”。 假设函数被称为“maybe”
|
![]() |
12
2
不是为了反驳先前的理论或数学答案,而是一个函数也是一个对象(在面向对象的编程语言中),它只有一个方法,并且有效地用作函数。 一个例子是Java中的Runnabl接口,它只有一种方法:Run。 考虑这个例子,首先在javascript中,它具有一流的函数:
输出: 〔1, 4, 25,100〕 map方法获取一个函数并返回一个新数组,其中每个元素都是将该函数应用于原始数组中相同位置的值的结果。 同样的事情是Java,使用一个函子,你首先需要定义一个接口,比如:
然后,如果添加一个具有map函数的集合类,可以执行以下操作:
它使用IntmapFunction的内联子类来创建一个函数,该函数与前面的javascript示例中的函数OO等效。 使用函数可以在OO语言中应用函数技术。当然,一些OO语言也直接支持函数,所以这不是必需的。 |
![]() |
13
2
粗略概述在函数编程中,a 函子 基本上是起重普通的结构 一元的 函数(即只有一个参数的函数)到新类型变量之间的函数。在普通对象之间编写和维护简单的函数并使用函数来提升它们,然后在复杂的容器对象之间手动编写函数要容易得多。另一个优点是只写一次普通函数,然后通过不同的函数重新使用它们。 函数的例子包括数组、“maybe”和“either”函数,futures(参见 https://github.com/Avaq/Fluture )和其他许多。 插图
考虑从名字和姓氏构造完整的人名的函数。我们可以这样定义它
如果我们有很多人在一个阵列中呢?我们可以简单地重用我们的函数,而不是手动遍历列表。
并使用它
只要我们的每一个入口
在哪里?
并使用它
范畴论
一
函数
在里面
范畴论
是两个类别之间关于其形态组成的映射。在一个
计算机语言
,主要的兴趣类别是
物体
是
类型
(某些值集),以及
态射
是函数
例如,取
在这里
由于我们只考虑集合类别,因此 函子 从它到它本身是映射发送对象到对象和吗啡到吗啡,满足某些代数定律。
例子:
|
![]() |
14
0
kiss:函数是一个有map方法的对象。javascript中的数组实现映射,因此是函数。承诺、流和树通常以函数语言实现映射,当它们实现时,它们被视为函数。该函数的map方法接受它自己的内容,并使用传递给map的转换回调对每个内容进行转换,并返回一个新的函数,其中包含作为第一个函数的结构,但包含转换后的值。 SRC: https://www.youtube.com/watch?v=DisD9ftUyCk&feature=youtu.be&t=76 |
![]() |
15
-4
在实践中,函子是一个在C++中实现调用操作符的对象。在ocaml中,我认为functor指的是将一个模块作为输入输出另一个模块的东西。 |
![]() |
16
-6
简单地说,函数或函数对象是一个类对象,可以像函数一样调用它。 在C++中: 这就是你写函数的方法
这就是你如何写一个函数
现在您可以这样做:
这些函数之所以伟大,是因为你可以在类中保持状态——想象一下,如果你想问一个函数被调用了多少次。没有办法以一种整洁、封闭的方式来完成这项工作。对于一个函数对象,它和其他类一样:您将有一些实例变量需要递增
|
![]() |
17
-10
函数与函数编程无关。它只是一个指向函数或某种对象的“指针”,可以像调用函数一样调用它。 |
![]() |
Tosh · ocaml获取语法错误[已关闭] 6 年前 |
![]() |
Beta Ziliani · OCaml-与类型别名混淆(警告40) 6 年前 |
![]() |
Jheel rathod · 带有构造函数的ocaml递归类型记录 6 年前 |
![]() |
HegoDamask · (OCaml:非穷举模式匹配) 6 年前 |
![]() |
Flux · 如何以静默方式加载顶级模块 6 年前 |
![]() |
Flux · 如何编写显示HTML或重定向到其他页面的服务 6 年前 |
![]() |
Daiwen · ocaml中GADT的异构列表[重复] 7 年前 |
![]() |
nejifnjalz · OCaml语法错误-有趣的模式匹配 7 年前 |
![]() |
M. Walker · 无法键入多态[%bs.raw函数 7 年前 |