我可以使用lambda语法获取列表中的偶数:
[1..10] |> List.filter (fun x -> x % 2 = 0)
但是我想用它组成,就像这样:
[1..10] |> List.filter ((% 2) >> (= 0))
错误:stdin(7,37):错误FS0010:表达式中出现意外的整数文字。预期')'或其他令牌。
答案 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