《Haskell趣学指南》读书笔记(2):Type And Typeclass

本文是《Haskell趣学指南》的读书笔记,主要探讨Haskell的类型系统,包括如何使用:t命令检测类型,了解基本数据类型如Char、Int等,以及函数类型的声明。此外,还深入解析了类型类(Typeclasses),如Eq、Ord、Show、Read,阐述了它们的功能和使用场景,并指出Num、Integral和Floating等数字相关的Typeclass。
摘要由CSDN通过智能技术生成

前言:Haskell同python类似,支持类型推导,不需要额外告知数据类型。现在我们将理解haskell的类型系统

Type相关

|| :t 命令
检测表达式的类型

Prelude> :t "aaa"
"aaa" :: [Char] 

(tip: " :: " 读作 “它的类型”)

下面我们研究 符号 —> ::

|| “ :: ” 用于函数类型声明

mylast  :: [a] ->a  --类型声明
mylast[] = error"empty list"
mylast [x] = x
mylast (x:xs)  = mylast xs
--多个参数
myadd  :: int -> int -> int
myadd x y z = x + y + z

|| 基本数据类型
Char / Int / Float / Double / Bool (类型首字母需大写

|| 函数的数据类型
注意: 其中的 ‘a’ 不是一个数据类型,而是一个变量, 在haskell中变量可以是任意的类型 !

*Main> :t head
head :: [a] -> a
*Main> :t init
init :: [a] -> [a]
*Main> :t fst
fst :: (a, b) -> a

注意: 使用到类型变量为参数的函数被称为“多态函数”,可以接收热议类型的List

Typeclasses 相关

类型类

--查看 函数 == 的类型声明是怎样的
*Main> :t (==)
(==) :: Eq a => a -> a -> Bool
*Main> :t (>)
(>) :: Ord a => a -> a -> Bool
(*) :: Num a => a -> a -> a
*Main> :t (+)
(+) :: Num a => a -> a -> a
*Main> :t (-)
(-) :: Num a => a -> a -> a
*Main> :t (*)
(*) :: Num a => a -> a -> a
*Main> :t (/)
(/) :: Fractional a => a -> a -> a

下面我们研究 符号 —> =>

|| => 左边的部分称为类型约束,(由 前文知,变量a原本可以是任意类型,现在被约束)
针对Eq a => a -> a -> Bool 我们可以解读为:“相等函数取两个相同类型的值作为参数并回传一个Bool值,而这两个参数的类型在Eq这个类中(Eq对函数进行了类型的约束)”

|| 基本的Typeclass:

||| Eq 包含可判断相等性的类型。 == 、/= ( 除函数外所有的类型都属于Eq,故只有函数不能判断相等性)

||| Ord 包含可比较大小的类型 > < >= <= ( 除函数外所有的类型都属于Ord,故只有函数不能进行大小比较)
注意: 一个类型若是Ord类型,则必先是Eq类型

||| Show 包含可用字符串表示的类型 ‘show a’ ( 除函数外所有的类型都属于Show,故只有函数不能用字符串表示)

*Main> show 11
"11"

||| Read 包含可以由一个字符串转而成的其他的类型 read “a” (所有的类型都属于Read)

--read可以将字符串转化为Read中某类型
*Main> read "123" + 1
124

--报错 read不知道具体转换为哪个类型
*Main> *Main> read "123"
<interactive>:11:1: error: parse error on input*

Enum 包含可枚举的类型(也就是连续的类型) Bool,Char,Ordering, Int, Integer,Float,Double

Bounded 包含有一个上限和一个下限的类型 Int Char Bool

Num 是表示数字(整数和实数)的Typeclass,它的成员类型有数字特征

Integral 包含整数 Int Integer

Floating 包含浮点数 Float Double

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值