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