为什么返回int的函数被报告为类型为' - > INT

时间:2013-09-26 20:24:36

标签: f#

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

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

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

2 个答案:

答案 0 :(得分:4)

我认为你的意思是

calculateAlpha (int alpha) (int red)

使用原始括号,此行调用带有1个参数的calculateAlpha,并且该参数是2元组:

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

请参阅F# Functions的文档,特别是参数的部分应用。您将看到您无意中创建了函数newAlpha

答案 1 :(得分:2)

通常你会写int alpha来在F#中投射int;从技术上讲,(int)alpha也会起作用,但这不是“规范”的做事方式。无论如何,这不是问题所在。

你的代码中的问题实际上是因为没有围绕括号中的演员表;通过不这样做,F#编译器看到你的代码就像你写的那样:

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

这就是为什么你得到关于期待int而不是'a -> int的错误消息 - 你正在传递int函数(它将一些值转换为{{1} }})作为int的第一个参数。

通过在括号中包围您的演员表,您告诉编译器首先转换这两个值,然后将结果应用于calculateAlpha。这与您以原始样式调用函数时发生的情况相同:calculateAlpha;你甚至可以在calculateAlpha ((int)alpha, (int)red)附近留下括号,并写成:int