Есть короткий ответ и длинный ответ на ваш вопрос.
Краткий ответ
Короткая версия состоит в том, что функции F # (например, List.fold2
) принимают несколько параметров не с запятыми, как вы думаете, а с пробелами между ними. То есть, вы НЕ должны называть List.fold2
так:
List.fold2 (function, list1, list2)
а вот так:
List.fold2 function list1 list2
Теперь, если вы просто удалите запятые в своем вызове List.fold2
, вы увидите, что компилятор жалуется на ваш вызов getRow(matrix1, y)
и говорит вам заключить их в скобки. (А внешняя пара скобок вокруг List.fold2
на самом деле не нужна). Итак, это:
(List.fold2 (fun acc a b -> acc + (a*b)), getRow(matrix1, y), getColumn(matrix2, x))
Нужно превратить в это:
List.fold2 (fun acc a b -> acc + (a*b)) (getRow(matrix1, y)) (getColumn(matrix2, x))
Длинный ответ
Способ, которым функции F # принимают несколько параметров, на самом деле сильно отличается от большинства других языков, таких как C #. Фактически, все функции F # принимают ровно один параметр! «Но подождите, - вы, вероятно, думаете прямо сейчас, - вы только сейчас показали мне синтаксис для функций F #, принимающих несколько параметров!» Да, я сделал. Под капотом происходит комбинация карри и частичного применения . Я бы написал длинное объяснение, но Скотт Влашин уже написал одно, это гораздо лучше, чем я мог бы написать, поэтому я просто укажу вам серию https://fsharpforfunandprofit.com/series/thinking-functionally.html, чтобы помочь вам понять, что здесь происходит. (Разделы о карри и частичном применении - те, которые вам нужны, но я бы рекомендовал прочитать серию по порядку, потому что более поздние части основаны на концепциях, представленных в предыдущих частях).
И да, этот «длинный» ответ кажется короче, чем «короткий», но если вы прочитаете эту серию (а затем и остальную часть отличного сайта Скотта Влашина), вы обнаружите, что он намного длиннее короткого ответ. : -)
Если у вас есть еще вопросы, я с удовольствием постараюсь объяснить.