haskell中的函数柯里化和高阶函数

    函数柯里化指的是“一个接收多个参数的函数实际上每次只接收一个参数,然后返回一个接收下一个参数的另外一个函数,此过程重复下去,直到所有参数接收完毕,并在最后返回结果”。这也是haskell中函数的性质--所有的函数实际上只也只能接收一个参数,但是有些函数接收了多个参数是因为它们返回了另外一个接收一个参数的函数。
    高阶函数指的是:函数可以被当做参数传给另外的函数,也可以被当做返回值从某个函数返回。总之,haskell中函数是一等公民。
    高阶函数的好处在于,它往往能带来更好的可读性,更强的灵活性,以及更少的代码量。
    以java为例,假设你手头有两个数组,有一天来了一个任务,你需要把他们的每一项依次相加然后填充到另外一个数组里,即你需要从数组a[1,2,3]和数组b[4,5,6]得到数组c[5,7,9]。然后你写了一个小函数搞定了这件事。然后有过了几天你有了新的任务,你要把他们的每一项依次相乘然后填充到另外一个数组里..这样的相似的任务每天都来,相减..平方相加..立方相加..每次来了新任务都要写这么一堆的代码,代码量成倍增长,最后那些函数看起来一坨一坨的臃肿又难看。
    这时候高阶函数就派上用场了。在haskell中,完成这些任务简直不能再简单。假设能够完成这些任务的函数名字叫perfect
    ```
    perfect :: (a->b->c)->[a]->[b]->[c]
    perfect _ _ []=[]
    perfect _ [] _=[]
    perfect f (x:xs) (y:ys)=f x y:perfect f xs ys
    ```
    **是的,这就结束了。**那么它是怎么工作的呢?
    假设a=[1,2,3] b=[4,5,6]
    当我们需要列表相加的时候,perfect (+) a b
    当我们需要列表相乘的时候,perfect (*) a b
    当我们需要列表相除的时候,perfect (/) a b
    而当我们需要列表平方之后再相加的时候,我们就可以自己写一个f函数传进去:
    ```
    shit :: (Num a)=>a->a->a
    shit a b=a^2+b^2
    ```
    perfect shit a b
    这样就解决了平方相加的问题了。
    如你所见,函数式编程能提供的抽象服务还远不止于此,高阶函数只不过是个开始。不过讲真,纯函数其实并不是一个很好的选择,我觉得现代语言的发展趋势应该是在传统的指令式编程中加上一些函数式编程的特性,这样写起来既不烧脑又能很优雅。

猜你喜欢

转载自blog.csdn.net/u010742342/article/details/69062928