考虑以下函数:
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