《Haskell趣学指南》—— 第2章,第2.1节显式类型声明

本节书摘来自异步社区《Haskell趣学指南》一书中的第2章,第2.1节显式类型声明,作者 【斯洛文尼亚】Miran Lipovaca,更多章节内容可以访问云栖社区“异步社区”公众号查看

第 2 章 相信类型
Haskell趣学指南
强大的类型系统是Haskell的秘密武器。
在Haskell中,每个表达式都会在编译时得到明确的类型,从而提高代码的安全性。若你写的程序试图让布尔值与数相除,就不会通过编译。这样的好处就是与其让程序在运行时崩溃,不如在编译时捕获可能的错误。Haskell中一切皆有类型,因此编译器在编译时可以得到较多的信息来检查错误。

与Java和Pascal不同,Haskell支持类型推导(type inference)。写下一个数,不必额外告诉Haskell说“它是个数”,Haskell自己就能推导出来。

在此之前,我们对Haskell类型的讲解还只是一扫而过而已,到这里不妨打起精神来,因为理解这套类型系统对于Haskell的学习是至关重要的。

2.1 显式类型声明
我们可以使用GHCi来检查表达式的类型。通过:t命令,后跟任何合法的表达式,即可得到该表达式的类型。先试一下:

ghci> :t 'a'
'a' :: Char
ghci> :t True
True :: Bool
ghci> :t "HELLO!" 
"HELLO!" :: [Char] 
ghci> :t (True, 'a') 
(True, 'a') :: (Bool, Char) 
ghci> :t 4 == 5
4 == 5 :: Bool

::读作“它的类型为”。凡是明确的类型,其首字母必为大写。'a'是Char类型,意为字符(character)类型;True是Bool类型,意为布尔(Boolean)类型;而字符串"HELLO!"的类型显示为[Char],其中的方括号表示这是个列表,所以我们可以将它读作“一组字符的列表”。元组与列表不同,每个不同长度的元组都有其独立的类型,于是(True, 'a')的类型为(Bool, Char),而('a', 'b', 'c')的类型为(Char, Char, Char)。4 == 5必返回False,因此它的类型为Bool。

同样,函数也有类型。编写函数时,给它一个显式的类型声明是一个好习惯(至于比较短的函数就不必多此一举了)。从此刻开始,我们会对我们创建的所有函数都给出类型声明。

还记得第1章中我们写的那个过滤大写字母的列表推导式吗?给它加上类型声明便是这个样子:

removeNonUppercase :: [Char] -> [Char] 
removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']] 

这里removeNonUppercase的类型为[Char] -> [Char],意为它取一个字符串作为参数,返回另一个字符串作为结果。

不过,多个参数的函数该怎样指定其类型呢?下面便是一个将三个整数相加的简单函数。

addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z

参数与返回类型之间都是通过->分隔,最后一项就是返回值的类型了。(在第5章,我们将讲解为何统统采用->分隔,而非Int, Int, Int -> Int之类“更好看”的方式。)

如果你打算给自己的函数加上类型声明,却拿不准它的类型是什么。那就先不管它,把函数先写出来,再使用:t命令测一下即可。因为函数也是表达式,所以:t对函数也是同样可用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值