《Haskell趣学指南》笔记之类型(type)

栏目: 编程语言 · 发布时间: 5年前

  • :t <exp> 可以得到对应的类型
  • 类型是大写字母开头的
  • 给单参数函数声明类型,语法是 :: ParamType -> ReturnType
    removeNonUppercase :: [Char] -> [Char] 
    removeNonUppercase st = [ c | c <- st, c ` elem` ['A'..' Z']] 
    复制代码
  • 给多参数函数声明类型,语法是 :: Param1Type -> Param2Type ->ReturnType
    addThree :: Int -> Int -> Int -> Int 
    addThree x y z = x + y + z
    复制代码

基本类型

()

类型变量(类似于泛型)

  • head 的类型是 head :: [a] -> a
    • 注意这里的 a 是小写,不是大写,因为 a 是类型变量,不是类型
    • 一般类型变量只使用一个字母,但是用多个字母也不报错
  • 多态函数:使用了类型变量的函数。

类型类 typeclass

  • 类似于接口,但是它是用来约束类型 type 的。
  • 一个 type 可以是多个 typeclass 的实例,一个 typeclass 可以有多个 type 实例。
  • Eq 是最常见的类型类,Haskell 中标准类型都是 Eq 的实例,Eq 要求它的实例必须实现 ==/= 两个函数
  • 我们可以看看 == 运算符(也是函数)的类型
    ghci> :t (==) 
    (==) :: (Eq a) => a -> a -> Bool
    复制代码
  • 看上面代码,类型声明 a->a->Bool 前面有个 => ,再前面有个 (Eq a)
    • 这个 (Eq a) 叫做类型约束
    • 它约束 a 必须是 Eq 的实例,这样就保证了 a 必须实现 == 函数,以提供给全局的 == 函数调用
  • Ord 类型类要求实例必须实现 < / <= / > / >= 等比较操作
  • Ord 的有三种值:GT / LT / EQ,可以用 compare 得到
    ghci> compare 1 2
    LT
    复制代码
  • Show 类型类要求实例可以表示为字符串
  • show 函数可以把任意 Show 实例变为字符串
  • Read 类型类跟 Show 相反,它把非字符串的东西转为字符串
  • read 函数是 show 的相反操作
    ghci> show True 
    "True"
    ghci> (read "True") || False 
    True 
    复制代码
  • 注意直接 read "True" 会报错,因为 GHCi 需要根据后续的操作来确定你要把字符串转成什么类型
  • 类型注解:可以使用类型注解来告诉 GHCi 这玩意是什么类型。 read "True" :: Bool 就不会报错,看起来很像 TypeScript 的 as 关键字
  • Enum 类型类要求实例有 successer 后继和 predecesor 前趋两个操作。可以使用 succ 函数和 pred 函数得到一个实例的后继和前驱。
  • Enum 的例子
    ['a' .. 'e']
    [LT..GT]
    
  • Bounded 类型类要求实例有上限和下限
  • 用 maxBound 和 minBound 可以获取实例的上下限
  • 这两个函数的类型是 (Bounded a)=> a ,这叫多态常量(跟多态函数对应)。
  • maxBound :: (Bool, Int, Char) 会得到每个实例的上限组成的 tuple,即 (True, 2147483647, \1114111)
  • Num 类型类要求实例具有数的特征。
  • :t 20 的结果是 (Num t)=> t
    • 这很奇怪, 20 的类型居然不是 Int 或者 Integer 或者 Float 之类的,而是这些类型对应的 typeclass 对应的多态常量,有点烧脑。
  • 所有的数都是多态常量,可以具有任何 Num 的实例的特征,也就是说 20 既可以是 Int / Integer 也可以是 Float / Double 等。
  • Floating 类型要求实例具有浮点数的特征,如 Float 和 Double 都是 Floating 的实例。
  • sin :: Floating a => a -> a
  • Integeral 类型要求实例具有整数的特征,如 Int 和 Integer。
  • fromIntegral :: (Num b, Integral a) => a -> b
  • length [1,2,3] + 3.2 会报错,解决办法是 fromIntegral (length [12,3]) + 3.2

类型类概览

  • Haskell 中所有标准 type 都是 Eq 的实例,除了输入输出相关类型和函数
  • 目前我们遇到的所有 type 都是 Ord 的实例,除了函数
  • 目前我们遇到的所有 type 都是 Show 的实例,除了函数
  • 目前我们遇到的所有 type 都是 Read 的实例,除了函数
  • Enum 类型类包含的 type 有 () / Bool / Char / Ordering / Int / Integer / Float / Double
  • Bounded 包含的 type 有 Int / Char / Bool 等
  • Num 包含 Int / Integer / Float / Double,只有已经属于 Show 和 Eq 的类型实例,才能成为 Num 的实例,这是一个先决条件( prerequisite)
  • Floating 包含 Float / Double
  • Integeral 包含 Int / Integer

以上所述就是小编给大家介绍的《《Haskell趣学指南》笔记之类型(type)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SRE

SRE

贝特西 拜尔 (Betsy Beyer)、等 / 孙宇聪 / 电子工业出版社 / 2016-10-1 / CNY 108.00

大型软件系统生命周期的绝大部分都处于“使用”阶段,而非“设计”或“实现”阶段。那么为什么我们却总是认为软件工程应该首要关注设计和实现呢?在《SRE:Google运维解密》中,Google SRE的关键成员解释了他们是如何对软件进行生命周期的整体性关注的,以及为什么这样做能够帮助Google成功地构建、部署、监控和运维世界上现存最大的软件系统。通过阅读《SRE:Google运维解密》,读者可以学习到......一起来看看 《SRE》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具