2

我有以下代码,它报告错误。我不明白错误信息。

module MonochromeHandler

open System.Drawing

let private transparent = Color.FromArgb(0, 0, 0, 0)

let private calculateAlpha currentAlpha greyValue =
    match currentAlpha - greyValue with
        | value when value < 0 -> 0
        | value -> value

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 ->
            let newAlpha = calculateAlpha((int)alpha, (int)red)
            Color.FromArgb(newAlpha, 0, 0, 0)
        | _ -> pixelColour

我在“ Color.FromArgb(newAlpha, 0, 0, 0)”行出现错误

Error   1   This expression was expected to have type
    int    
but here has type
    'a -> int

该函数有两个参数,我提供并返回一个 int。那么为什么 newAlpha 的类型不是“ int”,为什么是“ 'a -> int”?

可能与此有关,因为我声明calculateAlpha的参数没有括号或逗号,我对 F# 的(显然不充分的)理解是我应该能够这样使用它:

let newAlpha = calculateAlpha (int)alpha (int)red

如果我这样做,我会得到一个不同的错误calculateAlpha (int)alpha

Error   1   This value is not a function and cannot be applied

为什么我不能以这种方式调用该函数?

4

2 回答 2

4

我想你的意思是

calculateAlpha (int alpha) (int red)

使用您的原始括号,此行使用 1 个参数调用 calculateAlpha,该参数是一个 2 元组:

let newAlpha = calculateAlpha((int)alpha, (int)red)

请参阅F# Functions的文档,特别是Partial Application of Arguments。您将看到您是如何无意中创建了该功能的newAlpha

于 2013-09-26T20:31:30.607 回答
2

通常你会写在 F# 中强制int alpha转换;int从技术上讲,(int)alpha也可以,但这不是“规范”的做事方式。无论如何,这不是这里的问题。

您的代码中的问题实际上是由括号中的强制转换引起的;如果不这样做,F# 编译器会将您的代码视为您编写的代码:

let newAlpha = (((calculateAlpha int) alpha) int) red

这就是为什么您会收到有关期望 anint但有 an的错误消息的原因'a -> int——您将int函数(将一些值转换为 an int)作为第一个参数传递给calculateAlpha.

通过将您的转换括在括号中,您是在告诉编译器首先转换两个值,然后将结果应用于calculateAlpha. 这与您以原始样式调用函数时发生的情况相同calculateAlpha ((int)alpha, (int)red):你甚至可以把周围的括号去掉int,写成这样:calculateAlpha (int alpha, int red).

于 2013-09-26T21:03:03.953 回答