码迷,mamicode.com
首页 > 其他好文 > 详细

Haskell 笔记 ②

时间:2015-02-06 00:39:08      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

如何写一个求阶层函数?

   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]

 

Haskell 笔记 ②

标签:

原文地址:http://www.cnblogs.com/neopenx/p/4276176.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!