F# 为什么返回int的函数被报告为类型a'-&燃气轮机;int

F# 为什么返回int的函数被报告为类型a'-&燃气轮机;int,f#,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 <

我有下面的代码,它报告错误。但是我不理解错误信息

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
这个函数接受两个参数,我正在提供并返回一个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
为什么我不能以这种方式调用函数?

我想你的意思是

calculateAlpha (int alpha) (int red)
使用原始括号,此行使用1个参数调用calculateAlpha,该参数为2元组:

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

有关参数的部分应用,请参见文档。您将看到您是如何无意中创建函数的
newAlpha

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

代码中的问题实际上是由于没有围绕括号中的强制转换而产生的;如果不这样做,F#编译器会将您的代码视为您编写的:

let newAlpha = (((calculateAlpha int) alpha) int) red
这就是为什么您会收到一条错误消息,要求使用
int
而使用
'a->int
作为
calculateAlpha
的第一个参数传递
int
函数(该函数将一些值转换为
int


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

你不是在传递两个参数,而是在传递一个元组作为参数。好吧,这在一定程度上是有意义的。既然calculateAlpha期望currentAlpha为int,为什么当我传递一个(int*int)元组时它不报告一个错误呢?啊,那么(int)alpha不是转换为int的正确方法?如果不是强制转换,(int)alpha会做什么?
int
是一个核心函数,而不是C风格的强制转换。您正在调用以下内容:。括号没有增加任何意义,
(int)
的计算结果与
int
相同,它是以
alpha
作为唯一参数调用的。非常感谢您的帮助。我现在对F#!:)略知一二
let newAlpha = (((calculateAlpha int) alpha) int) red