Search code examples
performancefunctionhaskelllanguage-theory

Efficient representation of functions


Function type A -> B in some sense is not very good. Though functions are first class values, one often cannot freely operate them due to efficiency problems. You can't apply too many transformations (A -> B) -> (C -> D), at some point you have to compute a value.

Obviously this is due to the non-strict nature of -> .

There are well know tricks to deal with functions of type Double -> Double. One can represent them as vectors given a certain basis, which can consist of trig functions, polynomials etc.

Are there any general tricks to get round the inefficiency of the A -> B type?

Or alternatives to -> ?


Solution

  • Your concern seems to be that given h === f • g, f • g is typically less efficient than h. Given a composition of functions known at compile time, there are two tricks performed by the compiler which can render f • g more efficient than you would suspect -- inlining, and fusion. Inlining avoids the extra indirection of a second function call, and opens up many new opportunities for optimizations. Stream fusion (or build/foldr fusion) can (to give a basic example) turn compositions such as map f . map g into map (f . g) thereby reducing the number of traversals of a structure by a constant factor. Fusion operates not only on lists, but other structures, and provides one reason for the efficient performance of Haskell libraries such as Vector.

    Short cut fusion: http://www.haskell.org/haskellwiki/Correctness_of_short_cut_fusion

    Stream fusion: What is Haskell's Stream Fusion