我可以使用lambda语法获取列表中的偶数:
[1..10] |> List.filter (fun x -> x % 2 = 0)
Run Code Online (Sandbox Code Playgroud)
但是我希望得到它的构图,像这样:
[1..10] |> List.filter ((% 2) >> (= 0))
Run Code Online (Sandbox Code Playgroud)
错误:stdin(7,37):错误FS0010:表达式中出现意外的整数文字.预期')'或其他令牌.
F#不支持运算符部分.您可以通过将运算符括在括号中来部分应用运算符,如下所示:
let five = (+) 2 3
let add2 = (+) 2
let alsoFive = add2 3
Run Code Online (Sandbox Code Playgroud)
但是,这不允许您部分应用运算符的正确参数.换句话说,F#不提供与Haskell表达式等价的任何东西(/ 2).这可以解决交换运算符,例如加法或乘法,因为(+ 2) === (2 +)在F#中可以表示((+) 2)为非交换运算符,但不能表示为非交换运算符.
你可以做的最好的事情是将该部分声明为一个单独的函数,如下所示:
let mod2 x = x % 2
[1..10] |> List.filter (mod2 >> ((=) 0))
Run Code Online (Sandbox Code Playgroud)
如果你绝对坚持不再声明任何功能,你可以尝试用flip:
[1..10] |> List.filter ((flip (%) 2) >> ((=) 0))
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,F#标准库也没有提供flip功能,所以你必须自己声明它:
let inline flip f a b = f b a
Run Code Online (Sandbox Code Playgroud)
就个人而言,我宁愿提高可读性并声明一个isEven函数:
let isEven x = (x % 2) = 0
[1..10] |> List.filter isEven
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |