haskell学习
2021-03-03 17:29:37 8 举报
AI智能生成
haskell学习
作者其他创作
大纲/内容
数据
个体类型
数字
字符
字符串
字符串也可以看作一种List
[Char]
所有的场景都是这样的
集合类型
List
[1,2,3]只是1:2:3[]
Range
Tuple
Tuple 的类型取决于它的长度及其中项的类型
Type Variable
类似范型,但更为强大
Typeclass
Eq
==
/=
Ord
>
<
<=
>=
GT, LT, EQ
成为Ord的成员,必先加入Eq家族。
Show
它可以取任一Show的成员型别并将其转为字串。
Read
Read 是与 Show 相反的 Typeclass
Enum
Enum 的成员都是连续的
也就是可枚举
Bounded
Bounded 的成员都有一个上限和下限。
如果其中的项都属于 Bounded Typeclass,那么该 Tuple 也属于 Bounded
Num
是表示数字的 Typeclass,它的成员型别都具有数字的特征。
型别只有亲近 Show 和 Eq,才可以加入 Num。+
Integral
同样是表示数字的 Typeclass。Num 包含所有的数字:实数和整数。而 Integral 仅包含整数,其中的成员型别有 Int 和 Integer。
Floating
Floating 仅包含浮点型别:Float 和 Double。+
:t
=>
ghci> :t (==) (==) :: (Eq a) => a -> a -> Bool
"相等函数取两个相同型别的值作为参数并回传一个布林值,而这两个参数的型别同在 Eq 类之中(即型别约束)"
函数需要被括起来,才能看类型
过程
表达式(单行,单截)
括号只是用来改变运算顺序
运算符
+-*/
/=
不等于
not
++
List和字符串联接
:
把元素加入List
只加在头上
如果想加在尾上估计只能使用++
每个表达式都有返回值
代码块(多行表达式)
任何一个表达式都有返回值
if和else也会返回,所以else是不能省的
List Comprehension
多个条件用,分隔
多个条件取并
不止有条件,也可以有let表达式
let表达式声明的变量,在后面的条件表达式里和输出函数里都可以访问
calcBmis xs = [bmi | (w, h) <- xs, let bmi = w / h ^ 2, bmi >= 25.0]
函数
多参数用空格分割
最后一行是返回值
函数的运算优先级大于别的
多态函数
类型变量为参数
(a, b) -> a 这a和b不一定是不同类型
使用反单引号,可以用中缀形式调用函数
a `elem` xs
模式匹配Pattern Matching
模式匹配似乎就是一个函数有多种定义
可以把一个具体的参数值当参数
顺序很重要
优先匹配最符合的那一个
所以最后一个才设计为万能的
在定义模式时,一定要留一个万能匹配的模式
_表示不感兴趣
可以用 [] 或 : 来匹配List
``x:xs`` 这模式的应用非常广泛,尤其是递归函数。不过它只能匹配长度大于等于 1 的 List。
做参数的时候要用() 括起来
as模式
xs@(x:y:ys)
可以用xs取到原始的List/String
guide
guard 用来检查一个值的某项属性是否为真
关键字 where
where放在guide的后面
where里也可以用模式匹配
where bmi = weight / height ^ 2 (skinny, normal, fat) = (18.5, 25.0, 30.0)
initials :: String -> String -> String initials firstname lastname = [f] ++ ". " ++ [l] ++ "." where (f:_) = firstname (l:_) = lastname
where里定义的变量的不仅在参数这边能用,在函数体里也能用
对于所有的guide都可以用
关键字Let
let 的格式为 let [bindings] in [expressions]。在 let 中绑定的名字仅对 in 部分可见。let 里面定义的名字也得对齐到一列。
没有in的话就是在整个代码块里可见了
多个变量用;隔开
可以用在List comprehension里
case expression
case expression of pattern -> result pattern -> result pattern -> result ...
模式匹配本质上不过就是 case 语句的语法糖而已。
这在表达式中作模式匹配很方便,由于模式匹配本质上就是 case 表达式的语法糖,所以这两段也是等价的:
describeList :: [a] -> String describeList xs = "The list is " ++ case xs of [] -> "empty." [x] -> "a singleton list." xs -> "a longer list."
describeList :: [a] -> String describeList xs = "The list is " ++ what xs where what [] = "empty." what [x] = "a singleton list." what xs = "a longer list."
Curry Function
不全调用
中缀函数也可以不全调用,用括号把它和一边的参数括在一起就行了。
isUpperAlphanum :: Char -> BoolisUpperAlphanum = (`elem` ['A'..'Z'])
其他
静态类型语言
只要我们定义出一个维度,就会演化出一套数学可以运算的系统
当我们看到一个语法不知道怎么用的时候,说明我们见到的情景太少
括号的奇怪用法
函数
List的模式
Tuple
语言学习
先广度,再深度
通过快速的方式筛出全部的关键点,然后再深挖
筛出关键点的过程是要辅以思维导图的
要关注同一种目的的多种手法
同一种东西的多种表现形式
形式,本身蕴含着一些知识
0 条评论
下一页