【发布时间】:2011-04-17 08:12:35
【问题描述】:
大家好。
我是一名 C# 程序员,在空闲时间探索 F#。我编写了以下二维图像卷积的小程序。
open System
let convolve y x =
y |> List.map (fun ye -> x |> List.map ((*) ye))
|> List.mapi (fun i l -> [for q in 1..i -> 0] @ l @ [for q in 1..(l.Length - i - 1) -> 0])
|> List.reduce (fun r c -> List.zip r c |> List.map (fun (a, b) -> a + b))
let y = [2; 3; 1; 4]
let x = [4; 1; 2; 3]
printfn "%A" (convolve y x)
我的问题是:上面的代码是惯用的 F# 吗?可以更简洁吗? (例如,是否有一些更短的方法来生成填充的 0 列表(为此我在代码中使用了列表理解))。是否有任何可以提高其性能的更改?
任何帮助将不胜感激。谢谢。
编辑:
谢谢布赖恩。我没有得到你的第一个建议。这是应用您的第二个建议后我的代码的外观。 (我也抽象出了list-fill操作。)
open System
let listFill howMany withWhat = [for i in 1..howMany -> withWhat]
let convolve y x =
y |> List.map (fun ye -> x |> List.map ((*) ye))
|> List.mapi (fun i l -> (listFill i 0) @ l @ (listFill (l.Length - i - 1) 0))
|> List.reduce (List.map2 (+))
let y = [2; 3; 1; 4]
let x = [4; 1; 2; 3]
printfn "%A" (convolve y x)
还有什么可以改进的吗?等待更多建议...
【问题讨论】:
标签: f# functional-programming idioms