2015-11-11 4 views
1

Рассмотрите, у меня есть этот код.Тип 'int list -> int' не соответствует типу 'int'

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 

У меня есть ошибка в 2 последних строках:

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

Мне нужно, чтобы получить an int как мой выход у функции. Что не так с моим кодом?

+2

Подсказка: вы не используете 'numbersInCharacterList'. – ildjarn

ответ

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.

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.