挖了Haskell这个坑,希望在纯函数式环境锻炼自己的函数式编程思维
首先来说一下环境,首先安装Haskell Platform也就是GHC
推荐Mac下Haskell这个IDE,也可以在GHCI这样的REPL下练习
话不多说,现在来学习一下Haskell的基本语法
基本运算符
Haskell中的基本运算符与其他语言类似
加 减 乘 除 + - * /
1+1
布尔运算符 与 或 非 && || not
not True
关系运算符 等于 不等 == /=
not True == False
函数调用
Haskell中的函数调用使用空格的方式succ 8
succ
单参数函数,返回一个数的后继min 8 9
min
返回较大的元素
可以用``(数字1前的按键)将函数括起来作为中缀函数使用,如下
9 `div` 3
函数定义
函数式编程语言特点
在Haskell这门纯函数式语言中,Haskell中只有定义没有赋值,已经定义的值是不能修改的,类似于数学中的变量,它的意义是这个变量代表了一个值,而非这个变量处在这个值的状态,所以说纯函数式编程中函数只能去引用数的计算结果,不会产生副作用,无论何时以同样的参数call函数都会获得一样的结果,所以函数很适合作为first class,获得与其他语言中变量同等的地位
let关键词用于声明常量
let doubleMe x = x + x
doubleMe 2
let doubleUs x y =
{- 在函数中定义函数 -}
let doublex = 2 * x
doubley = 2 * y
in doublex + doubley
可以在函数中调用其他函数
let doubleUs x y = doubleMe x + doubleMe y
doubleUs 2 3
基本语句
if then else语句
Haskell中if语句实际上是一个表达式
每个if都要有thenelse两部分,else不是可选的,这也就保证了表达式一定有其返回值
let doubelSmallNumber x = if x > 100
then x
else doubleMe x
Haskell中常在函数名后加单引号'来区分一个相似的函数
case语句
case语句可以用来进行多值匹配
let isOneOrTwo x = case x of 1 -> "1:One"
2 -> "2:No Two"
otherwise -> "otherwise"
where语句
let doubleUs x y = doublex + doubley
where doublex = 2 * x
doubley = 2 * y
模式匹配
let lucky 7 = "You are lucky"
let lucky x = "Sorry, you are not lucky"
lucky 7
lucky 8
--另例
foo 0 x = x + 1
foo 1 x = x - 1
foo 2 x = 0
guard
let mydiv x y
| y == 0 = "Can not divide"
| x / y > 10 = "first number is larger than the second number"
| x / y < 1 = "first number is less than the second number"
| otherwise = "almost equal"
递归
--配合guard
let mysum x y
| x > y = mysum y x
| x == y = x
| otherwise = x + mysum (x+1) y
模式匹配与guard的区别:区别就在于一个对比的是对象,一个对比的是布尔值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。