haskell如何遍历

  • 顺序
  • 判断
  • 循环
  • 异常

上述四个操作时流程控制的常见操作,然而在haskell中是没有循环for这个关键字的,那么haskell时如何实现循环的呢?

递归

循环的平替最常见莫过于递归了,如下是一个为数组的每个数字+1

1
2
3
addOne :: [Int] -> [Int]
addOne [] = []
addOne (x:xs) = (x + 1) : addOne xs

高阶函数

所谓高阶函数就是函数的抽象,函数既可以作为参数,也可作为返回值。

高阶函数的底层也是通过递归实现,关于遍历的高阶函数通常都会附加一些通用操作,如

  • filter过滤元素: for + if
  • map转换元素: for + return
  • traverse碰到异常停止操作: for + throw

map

map函数接收两个参数

  • 操作,本例中就是+1
  • 被操作对象,本例就是数组
    1
    2
    3
    4
    5
    6
    7
    -- 冗余的写法如下
    addOne :: [Int] -> [Int]
    addOne array = map (+1) array

    -- 省略参数的写法
    addOne :: [Int] -> [Int]
    addOne = map (+1)

函子Functor

Functor的作用就是将一个操作作用于容器内的元素,这个容器不局限于数组,写法是操作<$>容器

1
2
3
4
5
6
7
-- 冗余的写法如下
addOne :: [Int] -> [Int]
addOne array = (+1) <$> array

-- 省略参数的写法
addOne :: [Int] -> [Int]
addOne = ((+1) <$>)