考虑一下,我有这个代码。
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函数的输出。
我的代码出了什么问题?
答案 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个。