守护是唯一能识别元组中的项是否与模式匹配中的值相同的方法吗?

Dav*_*rno 2 f# guard-clause

考虑以下功能:

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
Run Code Online (Sandbox Code Playgroud)

我想要做的是替换| (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错误.

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

Jac*_* P. 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
Run Code Online (Sandbox Code Playgroud)