挖了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的区别:区别就在于一个对比的是对象,一个对比的是布尔值。


Hydrogen
2.5k 声望73 粉丝

Write code for fun.


引用和评论

0 条评论