使用合成获得偶数

Joh*_*Doe 3 f#

我可以使用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:表达式中出现意外的整数文字.预期')'或其他令牌.

Fyo*_*kin 7

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)

  • 添加依赖项或声明自己 - 相同数量的工作.如果你有十几个,也许去依赖.但只有一个 - 太多了. (2认同)