考虑以下功能:
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错误.
有没有办法重写该行来简化满足编译器的保护?
这是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)