Mat*_*rný 3 refactoring f# sequence
我正在学习F#(再次),我试图在excel中总结一些行.这是我的尝试.
let sumRows (source: seq<double[]>) =
source
|> Seq.reduce (fun a b -> (a, b) ||> Seq.map2 (fun x y -> x + y) |> Seq.toArray)
Run Code Online (Sandbox Code Playgroud)
可以做得更好吗?我已经发现了双前进管道操作员,但现在,整个部分fun a b -> (a, b) ||>似乎很冗余......
你是对的,它是多余的,因为只有当你需要将一个元组转换成两个独立的参数时,双管道操作符才是方便的.在这种情况下,您已将它们作为2个单独的参数,因此您可以像这样传递它们:
let sumRows (source: seq<double[]>) =
source
|> Seq.reduce (fun a b -> Seq.map2 (fun x y -> x + y) a b |> Seq.toArray)
Run Code Online (Sandbox Code Playgroud)
我们可以|> Seq.toArray通过替换Seq.map2为Array.map2:
let sumRows (source: seq<double[]>) =
source
|> Seq.reduce (fun a b -> Array.map2 (fun x y -> x + y) a b)
Run Code Online (Sandbox Code Playgroud)
现在我们可以通过删除fun a b ->:
let sumRows (source: seq<double[]>) =
source
|> Seq.reduce (Array.map2 (fun x y -> x + y) )
Run Code Online (Sandbox Code Playgroud)
最后,您是否知道类似的运算符+可以通过括号括起来作为2参数函数(+)?
let sumRows2 (source: seq<double[]>) =
source
|> Seq.reduce (Array.map2 (+) )
Run Code Online (Sandbox Code Playgroud)
所有这些版本都具有相同的签名,它们都是正确的.你选择哪种更适合你的风格.
顺便说一下,你可能想进一步做到这一点:
let sumRows2 = Seq.reduce (Array.map2 (+) )
Run Code Online (Sandbox Code Playgroud)
但它会引起着名Value restriction错误的问题.有一些解决方法,比如添加类型注释或在代码中的某个地方实际使用它,但最好的解决方法是添加参数,就像我们之前一样.