代码之家  ›  专栏  ›  技术社区  ›  David Arno

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

f#
  •  2
  • David Arno  · 技术社区  · 11 年前

    我有以下代码,它报告错误。不过我不理解错误信息。

    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 回复  |  直到 11 年前
        1
  •  4
  •   Matt Stephenson    11 年前

    我想你是说

    calculateAlpha (int alpha) (int red)
    

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

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

    请参阅的文档 F# Functions 明确地 自变量的部分应用 。您将看到您是如何无意中创建该函数的 newAlpha !

        2
  •  2
  •   Jack P.    11 年前

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

    代码中的问题实际上是由于没有将强制转换放在括号中引起的;如果不这样做,F#编译器会看到你的代码,就好像你写了:

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

    这就是为什么您会收到关于期望 整数 但是有一个 'a -> int 相反,你正在通过 整数 函数(将一些值强制转换为 整数 )作为 calculateAlpha .

    通过在括号中包围您的强制转换,您告诉编译器首先强制转换这两个值,然后将结果应用于 计算Alpha 。这与以原始样式调用函数时发生的情况相同: calculateAlpha ((int)alpha, (int)red) ; 你甚至可以去掉括号 整数 在那里,并这样写: calculateAlpha (int alpha, int red) .