关键词:
Blog:
1.Introduction of Functional Language
2.Analysis of HTTP
3.Comparison of URL and URI
Practice:
1.Tomcat Server installation
一、数学和函数式编程
函数式编程由Lambda演算得来,因此它与我们学过的数学非常类似。在学习函数式编程之前,我们最好忘记之前头脑中的一些编程思想(如学习C C++的时候),因为前后两个编程思维完全不同。下面分别举例来说明函数式编程中的一些概念和数学中对应概念关系:
1.函数定义
数学中要求函数必须有自变量和因变量,所以在函数式编程中,每个函数必须有输入参数和返回值。你可以看到F#中的函数不需要显示地使用关键字return去返回某个值。所以,那些只有输入参数没有返回值、只有返回值没有输入参数或者两者都没有的函数在纯函数式编程中是不存在的。
2.无副作用
数学中对函数的定义有:对于确定的自变量,有且仅有一个因变量与之对应。言外之意就是,只要输入不变,那么输出一定固定不变。函数式编程中的函数也符合该规律,函数的执行既不影响外界也不会被外界影响,只要参数不变,返回值一定不变。
3.柯里化
函数式编程中,可以将包含了多个参数的函数转换成多个包含一个参数的函数。比如对于下面的函数:
let func x y = x + y
let result = func 1 2 //result为3
可以转换成
let func x =
let func2 = fun y -> x + y
func2
let result = (func 1) 2 //result结果也为3,可以去掉括号
可以看到,一个包含两个参数的函数经过转换,变成了只包含一个参数的函数,并且该函数返回另外一个接收一个参数的函数。最后调用结果不变。这样做的好处便是:讲一个复杂的函数可以分解成多个简单函数,并且函数调用时可以逐步进行。
其实同理,在数学中也有类似“柯里化”的东西。当我们计算f(x,y) = x + y这个函数时,我们可以先将x=1带入函数,得到的结果为f(1,y) = 1 + y。这个结果显然是一个关于y的函数,之后我们再将y=2带入得到的函数中,结果为f(1,2) = 1 + 2。这个分步计算的过程其实就是类似于函数式编程中的“柯里化”。
4.不可变性
数学中我们用符号去表示一个值或者表达式,比如“令x=1”,那么x就代表1,之后不能再改变。同理,在纯函数式编程中,不存在“变量”的概念,也没有“赋值”这一说,所有我们之前称之为“变量”的东西都是标识符,它仅仅是一个符号,让它表示一个东西之后不能再改变了。
5.高阶函数
在函数式编程中,将参数为函数、或者返回值为函数的这类函数统称之为“高阶函数”,前面已经举过这样的例子。在数学中,对一个函数求导函数的过程,其实就是高阶函数,原函数经过求导变换后,得到导函数,那么原函数便是输入参数,导函数便是返回值。
二、HTTP
通过阅读本书熟悉http
三、URI and URL
四、Practice
Tomcat Server installation
1.下载tomcat,去阿帕奇官网www.apache.org
选择projects
找到tomcat
选择版本
zip一般是通用的,选择zip
2.解压
解压后的目录结构
3.配置tomcat环境变量
4.启动tomcat
双击bin目录下文件
出现如上界面则启动成功
常见错误:端口号冲突
解决办法:配置文件,进入,,
70行左右,修改8080为可以访问的端口号。
重新启动tomcat,即可。
5.访问
默认端口号8080,默认访问界面是ROOT
如果要访问docs文件直接在路径后加上/docs
访问顺序,比如说要访问first文件
有两个index文件,为什么访问了后一个呢?
因为WEB—INF中有个配置文件中
配置了访问顺序。
6.常见状态码
7.虚拟路径
a.方式一
将web项目配置到webapps以外的目录
conf/server.xml中配置
host标签中:
<Context docBase="实际路径" path="相对路径">
每次都要重启
b.方式二
D:java webapache-tomcat-8.5.38confCatalinalocalhost中新建“项目名.xml”中写入
<Context docBase="实际路径" path="相对路径">
8.虚拟主机
通过www.test.com访问本机
a.conf/server.xml
自动补充方法:当字符串长度不够需要自动补充到一定的位数(代码片段)
1、代码/**自动补充方法:当字符串长度不够需要自动补充到一定的位数@parammainString需要补充的字符串@paramaddDigit补充到的位数@paramaddString补充的字符串@paraminPrefix在字符串前还是在尾部补齐@return完整的字符串*/-(NSString*)characterStrin... 查看详情
小菜鸡进阶之路-firstweek
距离上次编程近两年了,其实上次学C++感觉特别吃力,写代码也特别繁琐.实在提不起兴趣,最终结果可想而知,期末成绩得了60分(说明老师人不错),后来打算彻底放弃编程,但最近听到周围人都在学python,突然想试试.于是... 查看详情
前端学习知识点补充(代码片段)
文章是对之前学习的一些前端基础空白部分的补充所以不是完整的知识体系1HTML|CSSHTML5、CSS31、实体字符 空格<<小于号>>大于号&&¥¥©©×乘号÷除号全局属性:任何... 查看详情
cpp区块链模拟示例补充merkle树(代码片段)
Merkle树完整的比特币数据库(也就是区块链)需要超过140Gb的磁盘空间。因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本。随着越来越多的人使用比特币... 查看详情
firstweek——01introduction
machine learning algorithm:machine learning algorithm:machine learning algorithm: -Supervised learning= regression classification Supervised learning=\\begincases regression\\\\ 查看详情
reactredux快速入门(代码片段)
...xilihuasi校对者:xionglong58、Fengziyin1234注:对原文有增补(补充了请求api接口的完整实例以及配套源码)=====================想要理解Redux完整的 查看详情
java怎么用一个一维数组输出杨辉三角(补充完整下列代码)
...t[8];for(i=0;i<8;i++)追问???看不懂,后面还没写完吗。补充代码1代码2代码3 查看详情
docker补充(代码片段)
dockerfiledockerfile就是由一系列命令和参数构成的脚本,通过这个文件构建镜像,dockerfile就是一个文件,占得空间非常小。可以理解成一个文件里面写了很多命令。是什么作用,你把东西都写好在这个文件里了,执行这个文件,一... 查看详情
grep命令(代码片段)
这篇博客记录一下今天遇到的需求,以后补充为grep的完整文档。今天要查找某个目录(目录中包含多级目录)包含的所有文件中,包含某个字符串的文件。依稀记得grep有这个功能,就查了查资料,确实是有,完成工作后,把方... 查看详情
vs2010代码片段(代码片段)
...板的名称,然后连按两下TAB,VS就可以给我们把代码片段补充完整。1.内置代码片段关键字生成forfor(inti=0;i<length;i++)foreachforeach(varitemincollection)dodo…whileloopwhilewhile(true) ifif(true) 查看详情
matlab补充(代码片段)
matlab在linux里运行.m文件其他:matlab-nodesktop-nosplash-rfile#file不含.m 查看详情
完整的es6面试题
...解和代码展示,能够更好的帮助你理解。后续会在持续的补充。收集的较为完整的ES6的一些面试题,里面有较为详细的讲解和代码展示,能够更好的帮助你理解。后续会在持续的补充。 查看详情
020:reverse函数补充(代码片段)
补充reverse两点:1、如若在反转url时,需要添加参数,那么可以传递kwargs参数到reverse函数中,实例代码如下:returnredirect(reverse(‘detail‘,kwargs="id":‘123‘))2、如若想添加查询字符串参数,则必须手动进行url拼接,实例代码如下(... 查看详情
读写操作(补充)(代码片段)
读写操作(补充)之前的一篇有关终端读写的内容比较详细:https://blog.51cto.com/steed/2315597这篇,先补充了两个从终端逐行扫描并处理的示例。然后再补充了有关两个写入操作的内容。bufio包,逐行读取关于bufio包,使用它可以简... 查看详情
markdownsublime:隐藏/显示补充工具栏(代码片段)
算法分析八:总结补充补充(代码片段)
策略是面向问题的,算法是面向实现的。 一、不同算法策略特点小结1、贪心策略 贪心策略一方面是求解过程比较简单的算法,另一方面它又是对能适用问题的条件要求最严格(即适用范围很小)的算法。 &n... 查看详情
补充模块(代码片段)
struct模块 importstruct#压包res=struct.pack(‘i‘,999999999)print(res)print(len(res))#解包obj=struct.unpack(‘i‘,res)print(obj[0]) subprocess模块importsubprocessres=subprocess.Popen(‘dir‘,s 查看详情