注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云水居

云在青山水在天,人在江湖不得闲

 
 
 

日志

 
 

Haskell的函数  

2010-12-13 22:01:56|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

查看全文


崩溃啊,写了几千字,笔记本崩溃重启,全丢了!!!重新写
Haskell是一门函数编程语言,函数也是Haskell的核心部分。和C/C++一样,Haskell的函数也包括函数声明和函数定义两部分。C/C++的函数声明主要指定函数的参数和返回值的类型,函数实现定义函数的功能与实现方法。Haskell中也是这样的。一个Haskell的例子如下:
一个最简单的 add,首先编写一个add.hs脚本,然后加载(:l add),调用(add 3 4)
$ cat>add.hs<<EOF
add :: (Num a) => a->a->a
add x y = x+y
EOF
$ ghci
Prelude> l add
Prelude> add 3 4
7
Prelude> add 3 4.2
7.2

函数声明
在add.hs的例子中,函数声明部分是add::(Num a) => a->a->a
::是一个分割符,左边是函数名,右边是函数类型定义,关于函数类型参看<Haskell的数据类型
=>是分割符,左边是一些类型声明,(Num a)表示后面的a表示Num类型类;右边是参数和返回值的类型,用->符号分开,a->a->a的前两个a表示函数参数类型,第三个a是函数返回值类型,都是数值型。
此外,有时=>可以省略,例如:
isUpper :: Char -> Bool
isUpper x= x `elem` ['A'..'Z']
函数定义
在add.hs的例子中,函数定义部分是add x y = x+y
=号左边是函数名称和函数参数:add是函数名,x和y分别是第1和第2个参数。
=号右边是函数的实现:x+y表示函数的结果就是两个参数相加的结果。
函数语法
每种程序设计语言都有顺序,分支,循环语句相应的语法,Haskell也不例外。Haskell的函数语法主要有以下几种:
1。模式匹配
编译C/C++程序时,函数重定义是一个见的错误,但是在Haskell语言中,这种“错误”是一种常见的语法。
例如定义星期几的函数:
$ cat > week.hs<<EOF
week :: (Integral i) => i -> String
week 1="Monday"
week 2="Tuesday"
week 3="Wednesday"
week 4="Thursday"
week 5="Friday"
week 6="Saturday"
week 7="Sunday"
week x="Invalid day"
EOF
$ ghci
Prelude > :l week
Prelude > week 2
"Tuesday"
这个函数在执行的时候,按照函数定义的顺序依次对参数进行模式匹配,遇到匹配的就返回相应的函数值。
_符号在Haskell中有通配符的意思,例如fst的实现,就是取Tuple的第一个元素,第二个元素就不必关心,因此在函数定义中就用_来表示。
fst' (a,_)=a
:符号在List相关的函数定义中有重要的作用,例如sum,我们实现一个自己的sum
sum :: (Integral i) => [i] -> i
sum' []=0
sum' (x:xs)=x+sum'(xs)
2。岗哨
除了模式匹配外,还有一个岗哨的方式,在模式比较多的时候,可读性会更好一些:
week :: (Integral i) => i -> String
week x
        |x==1 ="Monday"
        |x==2 ="Tuesday"
        |x==3 ="Wednesday"
        |x==4 ="Thursday"
        |x==5 ="Friday"
        |x==6 ="Saturday"
        |x==7 ="Sunday"
        |otherwise ="Invalid day"
模式匹配的方式比较直观简单,但是重复太多,对离散度很高的情况尚且可以,但对分段函数就有些无能为力了,例如个人所得税的计算,用岗哨的方式就比较方便。如果用模式匹配就很麻烦了。
tax :: (RealFloat n) => n->n
tax x
        | x<=2000 = 0
        | x<=2500 = (x-2000)*0.05
        | x<=4000 = (x-2000)*0.10-25
        | x<=7000 = (x-2000)*0.15-125
        | x<=22000 = (x-2000)*0.20-375
        | x<=42000 = (x-2000)*0.25-1375
        | x<=62000 = (x-2000)*0.30-3375
        | x<=82000 = (x-2000)*0.35-6375
        | x<=102000 = (x-2000)*0.4-10375
        | otherwise = (x-2000)*0.45-15375

查看全文

  评论这张
 
阅读(1219)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017