我有以下代码,报告错误。我不明白错误信息。
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
为什么我不能以这种方式调用函数?
答案 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
。