F#签名理解:" - >运算符和编译器错误"

时间:2017-01-22 11:00:48

标签: compiler-errors f# signature

我有时会收到如下错误:

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 []

有人能让我理解,所以我将来可以独自处理这件事吗?

1 个答案:

答案 0 :(得分:4)

当阅读F#函数签名时,箭头(->)是一个分隔符,您可以阅读以下签名:

int -> int -> string

例如,作为一个需要2 int s并返回string的函数。这样呈现的原因之一是因为您还可以将此函数视为一个函数,该函数需要1 int并返回一个函数,该函数需要1 int并返回string ,这称为部分申请。

在这种情况下,我会使用错误中的行号来帮助您确定问题所在。 所以在第28行,你可以给它一个函数,它接受int并返回int,但它想要一个int值,也许你忘了用输入调用函数? 在第33行,它需要int list,这是表达list<int>的另一种方式。但是,您为其提供了一个功能intlist<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