如何为非对称运算符(例如模数运算符)创建一个部分函数应用程序,关于F#中没有任何参数名称的第一个参数?我的第一次尝试是
let mod10 = (%) 10 这当然转化为
mod10(x) = 10 mod x 而不是期望的
mod10(x) = x mod 10.当然我可以写
let mod10 x = (%)x 10 但是我不想为这个论点命名,所以有一些可以使用的占位符,比如说
let mod10 = (%)_ 10?
byt*_*ter 20
这是基于功能组合的解决方案.
let mod10 = (%) >> (|>) 10
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
替代语法:
let mod10_2 = (|>) 10 << (%)
Run Code Online (Sandbox Code Playgroud)
pad*_*pad 12
您可以定义flip在无点样式中常见的函数:
let inline flip f x y = f y x
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
let (%-) = flip (%)
let mod10 = (%-) 10
Run Code Online (Sandbox Code Playgroud)
或直接这样:
let mod10 = flip (%) 10
Run Code Online (Sandbox Code Playgroud)
无点样式并不总是可读(如本例所示)并且在F#编程中不受欢迎.