Partial function application for a non-symmetric operator using point-free style in F#?

前端 未结 2 1243
醉话见心
醉话见心 2020-12-11 19:01

How can I create a partial function application for a non-symmetric operator such as the modulus operator with regards to the first argument without any argument names in F#

相关标签:
2条回答
  • 2020-12-11 19:08

    You can define flip function which is common in point-free style:

    let inline flip f x y = f y x
    

    and use it like this:

    let (%-) = flip (%)
    let mod10 = (%-) 10
    

    or directly like this:

    let mod10 = flip (%) 10
    

    Point-free style is not always readable (as in this example) and not popular in F# programming.

    0 讨论(0)
  • 2020-12-11 19:31

    Here's solution based on functional composition.

    let mod10 = (%) >> (|>) 10
    

    UPD Here was a wordy explanation, but programmers speak the code, so I guess the following will describe it much better, in a manner of mathematical proof.

    The following expressions are equal:

    let m1 x = x % 10                    
    let m2 x = (%) x 10                  // x (op) y = (op) x y
    let m3 x = ((%) x) 10                // f x y = (f x) y
    let m4 x = 10 |>         ((%) x)     // f x = x |> f
    let m5 x = ((|>) 10)     ((%) x)     // x |> f = (|>) x f
    let m6 x = ((%) x)    |> ((|>) 10)   // f x = x |> f
    let m7 x = (x |> (%)) |> ((|>) 10)   // (op) x = x |> (op)
    let m8 x = x |> ((%)  >> ((|>) 10))  // f(x) |> g = x |> (f >> g)
    let m9   =       (%)  >> ((|>) 10)   // remove formal argument
    let m10  =       (%)  >>  (|>) 10    // remove unnecessary parenthesis
    

    Alternative syntax:

    let mod10_2 = (|>) 10 << (%)
    
    0 讨论(0)
提交回复
热议问题