2

考虑以下函数:

let private actionPixel(pixelColour:Color) =
    match (pixelColour.A, pixelColour.R, pixelColour.G, pixelColour.B) with
        | (0uy, _, _, _) -> transparent
        | (alpha, red, green, blue) when red = blue && red = green && red <> 255uy ->
            Color.FromArgb(calculateAlpha (int alpha) (int red), 0, 0, 0)
        | _ -> pixelColour

我想做的是替换| (alpha, red, green, blue) when red = blue && red = green && red <> 255uy ->| (alpha, value, value, value) when value <> 255uy ->. 如果我这样做,我会得到一个'value' is bound twice in this pattern错误。

有没有办法重写该行以简化满足编译器的防护?

4

1 回答 1

6

这就是 F# 的活动模式有用的地方——它允许您将匹配逻辑放入一个函数中,然后您可以使用这些模式,而不必担心匹配是如何在幕后发生的。

例如,您可以为您的代码定义一个活动模式并像这样使用它:

open System.Drawing

let (|Transparent|Grayscale|Color|) (color : Color) =
    if color.A = 0uy then Transparent
    elif color.R = color.G && color.R = color.B && color.R <> 255uy then
        let newAlpha = calculateAlpha (int alpha) (int red)
        Grayscale (Color.FromArgb (newAlpha, 0, 0, 0))
    else
        Color color

let private actionPixel (pixelColour : Color) =
    match pixelColour with
    | Transparent ->
        Color.Transparent
    | Grayscale c ->
        c
    | Color c ->
        c
于 2013-09-27T13:10:42.220 回答