①如何写一个求阶层函数?
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"