繁体   English   中英

F#中使用无点样式的非对称运算符的部分函数应用?

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

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

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

mod10(x) = 10 mod x而不是所需的

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

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

let mod10 = (%)_ 10

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

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 << (%)

您可以定义在无点样式中常见的flip功能:

let inline flip f x y = f y x

并像这样使用它:

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

或直接这样:

let mod10 = flip (%) 10

无点样式并不总是可读(如本例所示)并且在F#编程中不受欢迎。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM