我有时会收到如下错误:
opgave.fsx(28,14): error FS0001: This expression was expected to have type
'int'
but here has type
'int -> int'
opgave.fsx(33,35): error FS0001: This expression was expected to have type
'int list'
but here has type
'int -> int list -> int list'
令我困惑的是->
运营商的含义是什么?因为我理解它然后从第一个错误然后它预期一个int,但给出一个表达式,接受一个int并返回另一个int。也许我想念了?如果我是正确的那么究竟是什么问题?我发誓我以前做过类似的事。
这些错误所基于的代码如下所示:
member this.getPixelColors(x,y,p) : int list =
let pixel = image.GetPixel(x,y)
let stringPixel = pixel.ToString()
let rec breakFinder (s:string) (h:int) =
match s.[h] with
|',' -> s.[9..(h-1)] |> int
|_ -> (breakFinder(s (h+1))) // this is line 28
let rec yello x y p =
match x with
|l when l = imageW -> match y with
|k when k = imageH -> p@[(breakFinder stringPixel 0)]
|_ -> yello((0)(y+1)(p@[(breakFinder stringPixel 0)])) // this is line 33
|_ -> yello((x+1)(y)(p@[(breakFinder stringPixel 0)])) // there is an error in this line aswell identical to line 33
yello 0 0 []
有人能让我理解,所以我将来可以独自处理这件事吗?
答案 0 :(得分:4)
当阅读F#函数签名时,箭头(->
)是一个分隔符,您可以阅读以下签名:
int -> int -> string
例如,作为一个需要2 int
s并返回string
的函数。这样呈现的原因之一是因为您还可以将此函数视为一个函数,该函数需要1 int
并返回一个函数,该函数需要1 int
并返回string
,这称为部分申请。
在这种情况下,我会使用错误中的行号来帮助您确定问题所在。
所以在第28行,你可以给它一个函数,它接受int
并返回int
,但它想要一个int
值,也许你忘了用输入调用函数?
在第33行,它需要int list
,这是表达list<int>
的另一种方式。但是,您为其提供了一个功能int
,list<int>
并返回list<int>
。同样,也许您需要使用两个输入调用此函数以满足您的类型约束。
编辑:再看一遍,我想我可以猜出哪些是错误的。看起来当您调用其中一些函数时,您将多个参数放在括号中。 尝试将代码更新为:
member this.getPixelColors(x,y,p) : int list =
let pixel = image.GetPixel(x,y)
let stringPixel = pixel.ToString()
let rec breakFinder (s:string) (h:int) =
match s.[h] with
|',' -> s.[9..(h-1)] |> int
|_ -> (breakFinder s (h+1))
let rec yello x y p =
match x with
|l when l = imageW -> match y with
|k when k = imageH -> p@[(breakFinder stringPixel 0)]
|_ -> yello 0 (y+1) (p@[(breakFinder stringPixel 0)])
|_ -> yello (x+1)(y)(p@[(breakFinder stringPixel 0)])
yello 0 0 []
例如,要调用具有签名breakFinder
的{{1}},您可以这样做:string -> int -> int