F#点自由风格师

时间:2014-12-15 11:29:16

标签: f# pointfree partial-application

我正在寻找一种做无点风格分区的方法。点自由风格适用于大多数数学运算符,其中参数的顺序无关紧要,如乘法,减法或加法。

但问题在于我想要进行的划分div(x, y),但订单变为div(y, x)。如下例所示:

let aList = [2;4;6;8]
let mut = aList |> List.map ((/)2)

部分应用的功能变为(fun x -> 2 / x)。哪个会产生[1; 0; 0; 0],而我希望它是(fun x -> x / 2) -> [1; 2; 3; 4]

有没有简单的方法以点免费的方式做到这一点?

3 个答案:

答案 0 :(得分:3)

添加交换运算符/函数:

let swap f = fun x y -> f y x
let aList = [2;4;6;8]
let mut = aList |> List.map (swap (/) 2)

答案 1 :(得分:3)

使用翻转运算符:

 let aList = [2;4;6;8]
 let (<.>) f a b = f b a
 let mut = aList |> List.map ((/) <.> 2)

答案 2 :(得分:0)

我定义了MinusBy,DivBy,功能:

/// Minus, easy for pipe forward
let inline MinusBy y x = x - y

/// Division, easy for pipe forward
let inline DivBy y x = x / y

我如何在我的统计资料库中找到它有用:

// https://en.wikipedia.org/wiki/Normalization_(statistics)
let average = 2.0
let stdev = 3.0     // Standard Deviation
let Standardize (x:double) =
    x |> MinusBy average |> DivBy stdev

我从我的问题中得到了其他用户的想法:

F#, Pipe-forward first argument