使用合成获得偶数

时间:2017-11-06 16:32:47

标签: f#

我可以使用lambda语法获取列表中的偶数:

[1..10] |> List.filter (fun x -> x % 2 = 0)

但是我想用它组成,就像这样:

[1..10] |> List.filter ((% 2) >> (= 0))

错误:stdin(7,37):错误FS0010:表达式中出现意外的整数文字。预期')'或其他令牌。

1 个答案:

答案 0 :(得分:7)

F#不支持operator sections。您可以通过将运算符括在括号中来部分应用运算符,如下所示:

let five = (+) 2 3
let add2 = (+) 2
let alsoFive = add2 3

但是,这不允许您部分应用运算符的 right 参数。换句话说,F#不提供与Haskell表达式(/ 2)等价的任何东西。这可以用于交换运算符,例如加法或乘法,因为(+ 2) === (2 +)在F#中可以表示为((+) 2),但不能表示为非可交换的。{/ p>

您可以做的最好的事情是将该部分声明为单独的函数,如下所示:

let mod2 x = x % 2
[1..10] |> List.filter (mod2 >> ((=) 0))

如果您绝对坚持不再宣布任何其他功能,可以尝试使用flip

[1..10] |> List.filter ((flip (%) 2) >> ((=) 0))

但遗憾的是,F#标准库也没有提供flip功能,所以你必须自己声明它:

let inline flip f a b = f b a

就个人而言,我宁愿提高可读性并声明isEven函数:

let isEven x = (x % 2) = 0
[1..10] |> List.filter isEven