Hallo zusammen.
Ich bin ein C#-Programmierer, der in seiner Freizeit F# erforscht. Ich habe das folgende kleine Programm für die Bildfaltung in 2D geschrieben.
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)
Meine Frage ist: Ist der obige Code eine idiomatische F#? Kann es prägnanter gemacht werden? (z.B. Gibt es einen kürzeren Weg, um eine gefüllte Liste von 0's zu generieren (ich habe List Comprehension in meinem Code für diesen Zweck verwendet)). Gibt es Änderungen, die die Leistung verbessern können?
Für jede Hilfe wären wir Ihnen sehr dankbar. Danke!
EDITAR:
Danke Brian. Ich habe deinen ersten Vorschlag nicht verstanden. So sieht mein Code nach der Anwendung deines zweiten Vorschlags aus. (Ich abstrahierte auch den Vorgang des Listenauffüllens).
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)
Gibt es noch etwas, das verbessert werden kann? Ich erwarte weitere Vorschläge...