Haskell
特性
- haskell是一门纯函数式编程语言
- 变量一旦赋值,就不可以更改了
- haskell是惰性的。也就是说若非特殊指明,函数在真正需要结果以前不会被求值。
- haskell 是静态类型的。haskell拥有一套强大的类型系统,支持自动类型推导。
语言
list
- 在使用++运算符处理长字符串时要格外小心(对长List也是同样),Haskell会遍历整个的List(++符号左边的那个)。
- :运算符可以连接一个元素到一个List或者字符串之中
- [1,2,3]实际上是1:2:3:[]的语法糖。[]表示一个空List,若要从前端插入3,它就成了[3],再插入2,它就成了[2,3],以此类推。
- [Char]与String是等价的
类型
- Int 有界的
- Integer 无界的,效率不如Int高。类似Java的BigInt
- Float
- Double
- Bool
- Char
泛型,类型变量,类型类
- 类型定义行为的接口,如果一个类型属于某类型类,那它必实现了该类型类所描述的行为
- 很多从OOP走过来的人们往往会把类型类当成面向对象语言中的类而感到疑惑,厄,它们不是一回事。易于理解起见,你可以把它看做是java中接口(interface)的类似物。
常见类型类
- Eq 判断相等性
- Ord 可比较大小
- Show 可用字符串表示的类型
- Read 与Show相反的类型类
- Enum 可枚举。每个值都有后继子(successer)和前置子(predecesor),分别可以通过succ函数和pred函数得到
- Bounded 成员都有一个上限和下限。minBound和maxBound。
- Num 数字
- Integral 整数,其中的成员类型有Int和Integer
- Floating
递归
先定义一个边界条件,再定义个函数,让它从一堆元素中取一个并做点事情后,把余下的元素重新交给这个函数。
函数
本质上,haskell的所有函数都只有一个参数
多个参数的函数都是柯里函数
lambda就是匿名函数
lambda是个表达式,因此我们可以任意传递
不熟悉柯里函数与不全调用的人们往往会写出很多lambda,而实际上大部分都是没必要的 !!! 例如,表达式map (+3) [1,6,3,2]与map (\x -> x+3) [1,6,3,2]等价
有$的函数调用 函数调用符
. 函数组合: negate . abs == negate ( abs _) 函数组合是右结合的
模块
- haskell中的模块是含有一组相关的函数,类型和类型类的组合。而haskell程序的本质便是从主模块中引用其它模块并调用其中的函数来执行操作。
- haskell的标准库就是一组模块,每个模块都含有一组功能相近或相关的函数和类型。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com