4 Stimmen

Wie lässt sich dieser Code kompakter und idiomatischer gestalten?

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...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X