如何写一个求阶层函数?

fac 0 =1

fac n=n*fac(n-1)

函数自适应匹配参数,可以把特判情况写在前面,注意按顺序匹配的,n这种万能情况写在最前面就完蛋了。同时你也注意到,函数只能一行写完,不能智能识别作用域啊!!

②灵活的使用你的函数参数!

看这个求三元组第三个值的函数,占位符_的神奇使用。

third::(a,b,c)->c

third (_,_,c)=c

更神奇的手艹head函数, (x:_)中占位符模拟出了列表的剩余部分

head’::[a]->a

head’ (x:_) =x

若是固定长度的列表,可以这么写head’ (x:y:[] ) =x 或者 head [x,y]=x

③As模式(填坑中,看不懂)

④利用哨位(Guard)写出一个优美的递归程序, | 后面的那个布尔式叫哨位

fac n

| n==1 = 1

| n==2 = 2

|otherwise =n*fac(n-1)

尽管函数式语言不允许全局变量存在(全局就变成函数了,函数是确定,不可修改的)但是一个函数的尾部可以用where开设一个只赋值一次且作用域只是本函数的变量区,方便值一次计算多次,重复使用,用完销毁,变量区的变量必须对齐了,不然编译错。

fac n

| n==1 = x

| n==2 = y

|otherwise =n*fac(n-1)

where x=n*2

y=n*3

where的一次赋值特性其实表明它本体就是个函数,所以支持函数的匹配特性

where (f:_)=”2333”

(s:_)=”3223”

⑤where的老婆let?

我们知道let可以定义一个常量(函数),函数中let更是where的好妻子,其实它们就是倒过来而已。

看这个代码:

f length width height=

let s=length*width

in v=s*height

先开变量区,最后in进行表达式求值。

俗话说女人拥有社会最高权力,let..in 可以脱离函数使用,求个值~

let还支持分号和逗号,挤空间什么的。

let a=1;b=2;c=3 in a+b+c,let d=4 in a+b+c+d

列表表达式的条件区也可以写let,不过此时let式子不是过滤,而是计算作用了

f xs=[ans|x<-xs,let ans=x^2]

⑥简便而灵活的case .. of

C语言中的swich/case用法,不过这里的使用更加灵活,其实就是按顺序的模式匹配

f::String->String

f str = "hello" ++ case str of  "world" ->" world"

"fuck"->" bi~"

""->" none"

还记得where不?前面说where开辟的其实就是一块函数区,那么这里可以这么改写, YY个what函数而不用考虑类型。

f::String->String

f str = "hello" ++ what str

where what "world"=" world"

what "fuck"=" ~bi"

what ""=" none"

Haskell 笔记 ②的更多相关文章

  1. Haskell 笔记(三)类型系统

    类型 (Type) Haskell的类型系统式静态类型系统,在编译的时候就知道数据类型,所以不同类型的值运算在编译的时候就会报错,比如用布尔值和整数运算,在C语言中这种运算就不会报错. Haskell ...

  2. Haskell 笔记(四)函数系统

    函数系统 函数式编程当然少不了函数系统啦,在教程最初的时候就有一个最简单的函数,函数系统贯穿在Haskell全部,Haskell的函数有几个重要的性质. 首先声明一下函数的参数和返回值类型 然后有一个 ...

  3. Haskell 笔记 ③

    ①循环?NO!请递归思考问题! 手艹一个求列表中最大值代码,C语言中习惯性for扫一下比较出最大值.但是可以用递归! maximum'::(Ord a)=>[a]->a maximum' ...

  4. haskell笔记1

    haskell platform下载:https://www.haskell.org/platform/ 进入haskell控制台,终端输入 $ ghci 编译文件 :l file.hs 数组操作 & ...

  5. Haskell 笔记 ①

    ①一切都是函数,包括常量.表达式,格式:名字 参数1 参数2.. =函数内容 ②if语句(else绝对不可以省略) F=if (..) then x else y ③没有数组,只有列表[1,2,3,4 ...

  6. haskell笔记2

    模式匹配 # haskell_test.hs length' :: [a] -> a length' [] = 0 length' (_:x) = 1 + length' x as模式 xs@x ...

  7. Haskell复习笔记(一)

    Haskell笔记这是第三次总结,前两次都因为各种原因丢失了,对于Haskell我算不上什么大神,只不过在大学时为了学习算法时选择了Haskell. 当时的入门书籍选择的是<Learn You ...

  8. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

  9. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

随机推荐

  1. Android手绘效果实现

    效果图 原理 大概介绍一下实现原理.首先你得有一张图(废话~),接下来就是把这张图的轮廓提取出来,轮廓提取算法有很多,本人不是搞图像处理的,对图像处理感兴趣的童鞋可以查看相关资料.如果你有好的轮廓提取 ...

  2. iOS开发--UIDatePicker

    UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入.日期选取器的各列会按照指定的风格进行自动配置,这样 ...

  3. 线性代数 -- Linear Algebra with Applications

    @.如果线性方程组无解,则称该方程组是不相容的(inconsistent). @.如果线性方程组至少存在一个解,则称该方程组是相容的(consistent). @.等价方程组(equivalent s ...

  4. location url 反向代理到来机的其它端口 gitlab

    location /nexus { proxy_pass http://127.0.0.1:8081/nexus; } [root@GitMaven conf]# pwd /var/opt/gitla ...

  5. MVC – 15.路由机制

    15.1.路由检测插件 - RouteDebug 15.2.路由约束 15.3.命名路由 15.4.验证码 15.5.ASP.NET MVC 与 三层架构 15.6.Area区域 15.6.1.尝试将 ...

  6. Logcat打印调试信息

    Android Logcat调试中的V.D.I.W.E的分别代表什么? Log.v -- 黑色 -- verbose infoLog.d -- 蓝色 -- debug infoLog.i -- 绿色 ...

  7. 【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】

    一.网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付. 1.直接和银行对接. 2.使用第三方支付平台 3.常见的第三方支付平台 二.使用易宝 ...

  8. 【ubuntu 】常见错误--Could not get lock /var/lib/dpkg/lock

    ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错: E: Could not ...

  9. hdu 5000 dp **

    题目中提到  It guarantees that the sum of T[i] in each test case is no more than 2000 and 1 <= T[i]. 加 ...

  10. Node.js 究竟是什么?

    Node.js 究竟是什么? 一个 "编码就绪" 服务器 Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸 ...