地图
概括
本节包含来自的主题范畴论. 如果您不熟悉haskell或范畴理论,建议您阅读本文的其余部分,稍后再回来。
请注意,map的关键属性是它在更深的层次上查看第二个参数,即它在 和 括号。
这个类型签名属于
在哈斯克尔地图::(a->b)->[a]->[b]
.
概括地说,我们希望 超过由构造的数据类型仿函数而不仅仅是列表构造函数,比如树,只是为了说明一个示例。我们称之为广义的 作为
广义系统的haskell型签名
是函子f=>(a->b)->f a->f b
.
显然
这只是一个特殊的例子
定义为实例函子[],其中fmap=map
.
假设我们递归地定义一棵二叉树,表示一棵树只是另外两棵树的叶子或叉。
1.数据树A.=叶子A.|叉(树A.)(树A.)
如果我们已经有了一棵树,并决定将其所有节点增加1,该怎么办?
是的,我们必须这样做 树上的增量函数。
首先,我们从定义 事实上,在树上
1 2 3实例函子树哪里fmapF(叶子x)=叶子(Fx)fmapF(叉LR)=叉(fmapFL)(fmapFR)
现在,我们准备好了!
1.fmap(1.+)(叉(叉(叶子0)(叶子1.))(叉(叶子2.)(叶子3.)))
将评估为
1.叉(叉(叶子1.)(叶子2.))(叉(叶子3.)(叶子4.))
哈斯克尔
如前所述,haskell不仅有一个简单的地图
对于列表,但也鼓励您将其推广到每个函子。我们只是讨论一下地图
不过在这里。
当我们准备好函数时,说F
那名单呢L
,这很简单图f-l
他做这项工作。
评估前10个完美正方形
以下代码执行此任务:
1.地图(^2.)[1...10]
多么甜蜜和紧凑!
或者我们可以创建全部的完美的正方形,取前10个,这样:
1.拿10$地图(^2.)[1...]
python
地图
在python中,除了语法之外,这几乎是一样的。
下面的代码将计算前10个自然数的立方体
1.地图(兰姆达x:x**3.,润智(1.,11))
数学软件
这个
函数由地图
(区分大小写)在Mathematica中。
Mathematica的酷之处在于Mathematica的开发人员已经意识到地图
是如此重要以至于他们有一些语法上的糖分/@
可以作为同样的捷径。因此,,地图[f,l]
最好写成f/@l
. 请注意,这两种形式都是有效的。
检查1到100(含)之间有多少素数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17在里面[1.]:=PrimeQ/@范围[1.,100]出来[1.]={假的,真的,真的,假的,真的,假的,真的,假的,假的,\假的,真的,假的,真的,假的,假的,假的,真的,假的,真的,\假的,假的,假的,真的,假的,假的,假的,假的,假的,真的,\假的,真的,假的,假的,假的,假的,假的,真的,假的,假的,\假的,真的,假的,真的,假的,假的,假的,真的,假的,假的,\假的,假的,假的,真的,假的,假的,假的,假的,假的,真的,\假的,真的,假的,假的,假的,假的,假的,真的,假的,假的,\假的,真的,假的,真的,假的,假的,假的,假的,假的,真的,\假的,假的,假的,真的,假的,假的,假的,假的,假的,真的,\假的,假的,假的,假的,假的,假的,假的,真的,假的,假的,\假的}在里面[2.]:=计数[%1.]出来[2.]={{假的,75},{真的,25}}
因此,有25个素数。