F# - 代码改进

Cin*_*Bun 1 f#

我是F#的新手,我想出了一个相当简单的问题的解决方案,给定一串数字,我需要将每个数字加倍,然后得到这些数字的总和.例如,字符串"123456"应等于24

这是我能想到的

let input = "123456"
        |> Seq.map (string >> int)
        |> Seq.map (fun(x) -> x * 2)
        |> Seq.map (int >> string)
        |> String.concat String.Empty
        |> Seq.map (string >> int)
        |> Seq.sum
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以做出任何实质性的改变,使我的解决方案更加精简和高效吗?任何帮助将不胜感激

Gus*_*Gus 10

您可以通过应用某些属性来压缩代码.

fun x -> x * 2

fun x -> (*) x 2 (作为一个功能的操作员)

fun x -> (*) 2 x (可交换的)

(*) 2 (ETA-还原)

map 组合与要映射的函数的组成相同,您的前3个映射可以写成:

Seq.map (string >> int >> (*) 2 >> string)
Run Code Online (Sandbox Code Playgroud)

map然后concatcollect

map然后sumsumBy

所以你的代码可能是:

"123456"
    |> String.collect (string >> int >> (*) 2 >> string)
    |> Seq.sumBy (string >> int)
Run Code Online (Sandbox Code Playgroud)