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