初识Haskell 三:函数function
对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结。环境Windows
函数毫无疑问是函数式语言的核心。
在Haskell中(无特殊指明,以下皆是指在Haskell下),一个表达式用函数完成计算被称为a function application,函数后加空格然后跟随参数(arguments),如有多个参数,也以空格作为分隔。
函数的返回值即函数的类型,如一个函数的参数是类型a,返回值是类型b,写作a → b(在Haskell中用 -> 表示),读作a arrow b。
操作符其实也是函数,它有2个参数,写在2个参数中间,其实也可以像正常函数一样写在前面,但需要加( )如:

同样的,也可以像对待操作符一样将函数放在2个参数中间,但要加反引号( single-back-quote, ` ),如:

将函数定义在Haskell脚本文件(.hs)中,载入(在ghci中 :load)后,即可使用。
函数的声明:
function_name :: argType1 -> argType2 -> ... ->argTypen ->resultType
函数体:
function_name arg1 arg2 ... argn = expression that can use the arguments
模式匹配pattern matching
在定义函数时,为应对不同情况,可以有多个函数体,如:
f :: Integer -> String
f = "one"
f = "two"
f = "three"
在得到参数执行时,会从第一条开始比较是否符合,当遇到符合的才会执行,执行后即该函数执行完成,如果没有符合的会报错,如:

元组和list都可以作为函数参数,其中list有两种形式:1. [1,2,3, x ]的形式,用以表示list中有具体个数 2. x:xs 3. xs (可以用其他字母代替,如果一个叫x,它所在的list一般叫xs)。
练习题:

我的答案:
exercise3 :: Char -> Bool
exercise3 'a' = True
exercise3 x = False exercise4 :: String -> Bool
exercise4 "hello" = True
exercise4 x = False exercise5 :: String -> String
exercise5 (' ':xs) = xs
exercise5 xs = xs
另一种应对多种值的方法:guards。即使用bool表达式判断是否符合条件,符合则执行该行。
fact :: Integer -> Integer
fact n
| n < =
| n == =
| otherwise = n * fact (n - )
高阶函数higher order functions
参数和返回值都是正常的数据类型则该函数是一阶函数(first order)。以别的函数作为参数或者以其他函数作为返回结果则是高阶函数(higher order)。如:
twice :: (a -> a) -> a -> a
twice f x = f (f x)
函数是一次接收一个函数进行处理的,比如一个需要2个参数的函数 ,如果只给出第一个参数,那么返回的是一个需要一个参数来完成原函数的新函数(partial application)。
prod :: Integer -> Integer ->Integer
prod x y = x * y g = prod
p = g
q = twice g 3

条件表达式conditional expressions
样式:
if Boolean_expression then exp1 else exp2 --then和else都必须要有,exp1和exp2的type一样。
局部变量local variables: let Expressions
当某个固定式子被多次使用时,为了方便可以定义为局部变量。
样式:
let equation
equation
...
equation
in expression
上式的值为in后的expression。以求一元二次方程程序为例,要注意Tab缩进:
quadratic :: Double -> Double -> Double -> (Double, Double)
quadratic a b c =
let d = sqrt (b^ - * a * c)
x1 = (-b + d) / ( * a)
x2 = (-b -d) / ( * a)
in (x1, x2)
要注意从let到in expression,其整体就是一个表达式,如下所示:

let x = sqrt 9 in (x + 1) * (x - 1)的值为8.0(x的值为3.0),所以2 + let x = sqrt 9 in (x + 1) * (x - 1)的值为10.0。
局部变量local variables: where
另一种表达局部变量作为helper是where。如:
maximum :: [Int] -> Int
maximum [x] = x
maximum (x:xs)
| x > maxxs = x
| otherwise = maxxs
where maxxs = maximum xs
类型变量type variables
类似与Java中的泛型generics,在定义函数时不明确其类型,在应用时,根据传入参数的类型确定,这样就只要定义一个函数就可以应对多种不同类型,而不用为了类型不同,一一重复定义函数,体现了其多态性,在之前的例子中也有没有指明其类型而是用字母代替的,比如
fst :: (a, b) -> a
snd :: (a, b) -> b
类型变量必须以小写字母开头,通常用a,b...
初识Haskell 三:函数function的更多相关文章
- Javascript自执行匿名函数(function() { })()的原理分析
匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...
- Javascript自执行匿名函数(function() { })()的原理浅析
匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一 ...
- Javascript学习之函数(function)
在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 一 函 ...
- 初识Haskell
在COMP30026 Models of Computation中接触了新的编程语言Haskell,一个之前听都没有听过的语言,在此记录关于Haskell的一些最基本概念. 1.Haskell是一个函 ...
- JavaScript面向对象编程指南(三) 函数
第3章 函数 3.1 什么是函数 函数:本质是一种代码的分组形式.函数的声明如下: <script type="text/javascript"> /*函数的声明组成: ...
- Javascript入门(三)函数
Javascript函数 一.函数定义与执行 <script type="text/javascript"> //define function fun1(){ ale ...
- 孤荷凌寒自学python第十七天初识Python的函数
孤荷凌寒自学python第十七天初识Python的函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 函数是能够完成指定运算并返回运算结果的代码块.是结构化编程重要的结构. 我首先发现pyt ...
- 函数----Function对象
函数---Function对象 一 . 函数的书写 函数 : 就是将一些语句进行封装,然后通过调用的形式,执行这些语句. 函数的作用 : ● 将大量重复的语句写在函数里,以后需要这些语句的时候,可以 ...
- 分分钟钟学会Python - 函数(function)
函数(function) 1 基本结构 本质:将多行代码拿到别处并起个名字,以后通过名字就可以找到这行代码并执行 应用场景: 代码重复执行 代码量很多超过一屏,可以选择通过函数进行代码的分割 写代码方 ...
随机推荐
- MySQL学习(二)索引与锁 --- 2019年1月
1.Order By 是怎么工作的 MySQL做排序是一个成本比较高的操作.MySQL会为每个线程分配一个 sort_buffer 内存用于排序,该内存大小为 sort_buffer_size. 全字 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- .NET Core TDD 前传: 编写易于测试的代码 -- 全局状态
第1篇: 讲述了如何创造"缝". "缝"(seam)是需要知道的概念. 第2篇, 避免在构建对象时写出不易测试的代码. 第3篇, 依赖项和迪米特法则. 本文是 ...
- Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
问题:Xcode10 build 没问题,跑虚拟机也没问题,数据线连上run到真机上出现 Xcode 10 iOS12 "A valid provisioning profile for t ...
- .NET Core微服务之基于App.Metrics+InfluxDB+Grafana实现统一性能监控
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.关于App.Metrics+InfluxDB+Grafana 1.1 App.Metrics App.Metrics是一款开源的支持. ...
- 最简单的SpringBoot整合MyBatis教程
前面两篇文章和读者聊了Spring Boot中最简单的数据持久化方案JdbcTemplate,JdbcTemplate虽然简单,但是用的并不多,因为它没有MyBatis方便,在Spring+Sprin ...
- Asp.NetCore依赖注入和管道方式的异常处理及日志记录
前言 在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...
- SiftGPU在Ubuntu和Windows下的编译与使用
Sift特征应该是使用最多的局部特征了,但是相比其他的一些特征描述符,计算sift特征描述符的时间较长.Changchang Wu使用GPU加速,实现了GPU版的sift特征提取SiftGPU. Si ...
- 使用JsonProperty Attribute修改返回json
使用JsonProperty Attribute修改返回 json 值的name 本例使用JsonPropertyAttribute在序列化为JSON时更改属性的名称. public class Vi ...
- 从零讲解搭建一个NIO消息服务端
本文首发于本博客,如需转载,请申明出处. 假设 假设你已经了解并实现过了一些OIO消息服务端,并对异步消息服务端更有兴趣,那么本文或许能带你更好的入门,并了解JDK部分源码的关系流程,正如题目所说,笔 ...