Как рекурсивно получить скалярное значение из 2 списков? - PullRequest
1 голос
/ 05 ноября 2019

Задача - рекурсивно получить скалярное значение из 2 списков. Я написал код, который, по моему мнению, должен работать, но у меня возникла проблема, связанная с типом

let rec scalar2 (a, b) = function
  | ([], []) -> 0
  | ([x : int], [y : int]) -> x * y
  | (h1::t1, h2::t2) -> 
        let sc : int = scalar2 (t1,t2) 
        sc + (h1 * h2) 

Ошибка состоит в том, что scalar2 (t1,t2) запрашивается как int, но это int list * int list -> int

Как можно решить эту проблему?

1 Ответ

3 голосов
/ 05 ноября 2019

При определении функции с помощью ключевого слова function вам не нужно называть свои параметры (a и b здесь). Обратите внимание, что ваше тело функции вообще не ссылается на a или b. Вы хотите, чтобы scalar2 была функцией, а выражение function справа приводит к функции, поэтому просто присвойте эту функцию scalar2 напрямую.

let rec scalar2 = function
  | ([], []) -> 0
  | ([x : int], [y : int]) -> x * y
  | (h1::t1, h2::t2) -> 
        let sc : int = scalar2 (t1,t2) 
        sc + (h1 * h2) 

Вероятна ваша ошибкавызвано путаницей с обычным способом определения функции, который не использует ключевое слово function:

let rec scalar2 (a,b) =
  match (a,b) with
  | ([], []) -> 0
  | ([x : int], [y : int]) -> x * y
  | (h1::t1, h2::t2) -> 
        let sc : int = scalar2 (t1,t2) 
        sc + (h1 * h2) 

Таким образом, вам нужно выражение match, которое использует параметры aи b.

Обратите внимание, что оба эти определения являются неполными, поскольку вы еще не сказали, что должно произойти, если только один из списков не пуст.


Комуобъясните ошибку типа в исходном коде, рассмотрите, как F # оценивает let sc : int = scalar2 (t1,t2). Ваше первоначальное определение гласит, что scalar2 (a,b) = function ..., и левая часть этого равенства имеет ту же форму, что и выражение scalar2 (t1,t2).

Таким образом, scalar2 (t1,t2) заменяется выражением function ... после того, какподставив t1 для a и t2 для b. Это оставляет let sc : int = function ..., который, конечно, не проверяет тип.

...