【问题标题】:Partial function application for a non-symmetric operator using point-free style in F#?在 F# 中使用无点样式的非对称算子的偏函数应用?
【发布时间】:2012-07-07 20:31:52
【问题描述】:

如何为非对称运算符(例如模运算符)创建关于第一个参数的偏函数应用程序,而 F# 中没有任何参数名称?我的第一次尝试是

let mod10 = (%) 10 当然翻译成

mod10(x) = 10 mod x 而不是想要的

mod10(x) = x mod 10。 当然可以写

let mod10 x = (%)x 10 但我不想给参数命名,所以有一些可以使用的占位符,比如

let mod10 = (%)_ 10?

【问题讨论】:

    标签: f# pointfree


    【解决方案1】:

    这里是基于功能组合的解决方案。

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

    UPD这是一个冗长的解释,但程序员会说代码,所以我想下面会以数学证明的方式更好地描述它。

    下列表达式相等

    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
    

    替代语法:

    let mod10_2 = (|>) 10 << (%)
    

    【讨论】:

    • 真的很棒的证明!对于像我这样的新手来说,这个解决方案有点难以解读,但仍然非常漂亮:)
    • @Christian:它也可以被链接:let combinator (b: 'b) (c: 'c) (f: 'a -&gt; 'b -&gt; 'c -&gt; 'd) : ('a -&gt; 'd) = f &gt;&gt; ((|&gt;) b) &gt;&gt; ((|&gt;) c)
    【解决方案2】:

    您可以定义flip 函数,该函数在无点样式中很常见:

    let inline flip f x y = f y x
    

    并像这样使用它:

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

    或者直接这样:

    let mod10 = flip (%) 10
    

    无点样式并不总是可读的(如本例所示),并且在 F# 编程中并不流行。

    【讨论】:

    • 啊好“把戏”!我同意无点样式并不总是可读的,但我想这适用于所有样式。
    • 编程并不是真正的人气竞赛。此外,很难确定人气。它可能不常见,但这并不意味着它不受欢迎。在很多情况下,我喜欢无点,但在其他情况下,它确实会降低可读性。
    • @pad:我们的编程生活充满了主观性,不是吗? :) 这就是让世界变得丰富多彩的原因!
    猜你喜欢
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多