类型'int list - > int'与'int'类型不匹配

时间:2015-11-11 22:06:44

标签: f#

考虑一下,我有这个代码。

let firstDigitIsBigerOrEqual (dig1: int) (dig2:int)= dig1>=dig2

let rec computeNumber( numbersInCharacterList:List<int>)=function
      | [] -> 0
      | [single] ->  single
      | firstDigit::secondDigit::tail   when       firstDigitIsBigerOrEqual firstDigit secondDigit   -> firstDigit  + secondDigit+ computeNumber tail
      | firstDigit::secondDigit::tail   when  not (firstDigitIsBigerOrEqual firstDigit secondDigit)  -> secondDigit - firstDigit + computeNumber tail

我在最后两行中有一个错误:

The type 'int list -> int' does not match the type 'int'

我需要an int作为y函数的输出。 我的代码出了什么问题?

2 个答案:

答案 0 :(得分:4)

如@ildjarn所述,您未使用numbersInCharacterList参数。这是一个非常容易犯的错误。当你想编写一个模式匹配其输入的函数时,你有两种方法。

通过定义正常函数并使用match构造:

let rec someRecursiveFunc inputList =
  match inputList with
  | [] -> 0
  | x::xs -> 1 + someRecursiveFunc xs

或者,通过使用function关键字定义函数:

let rec someRecursiveFunc = function
  | [] -> 0
  | x::xs -> 1 + someRecursiveFunc xs

在第二种情况下,函数有一个隐式(匿名)参数,我们立即进行模式匹配。您的代码混合了两者 - 它具有显式参数,但随后使用function

答案 1 :(得分:0)

使用模式匹配功能时,您不需要声明该功能的参数。因此,在您的示例中,请删除numbersInCharacterList:List<int>,以便您的函数签名为:

let rec computeNumber = function
    //rest of code...

来自MSDN Match Expressions

// Pattern matching with multiple alternatives on the same line.  
let filter123 x =
    match x with
    | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
    | a -> printfn "%d" a

// The same function written with the pattern matching
// function syntax.
let filterNumbers =
    function | 1 | 2 | 3 -> printfn "Found 1, 2, or 3!"
             | a -> printfn "%d" a

使用函数语法时,注意x不在函数签名中(第二个示例)。

如果你看一下你的功能的签名是:

val computeNumber : numbersInCharacterList:int list -> _arg1:'a -> int

请注意_arg1 numbersInCharacterList:int - 您现在有2个参数而不是1个。