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



考虑以下函数:

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, value, value, value) when value <> 255uy ->替换| (alpha, red, green, blue) when red = blue && red = green && red <> 255uy ->。但是,如果我这样做,则会出现'value' is bound twice in this pattern错误。

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

这就是 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

相关内容

  • 没有找到相关文章

最新更新