При определении функции с помощью ключевого слова 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 ...
, который, конечно, не проверяет тип.