#f# #pattern-matching
#f# #сопоставление с шаблоном
Вопрос:
(Я новичок в F #). У меня есть следующие определения в F#:
init i j =
{ Id = Guid.NewGuid ()
InnerRows = [0 .. 2] |> List.map (Cell.init i j)
SelectedInnerRow = None}
let update msg m =
match msg with
| Select id -> { m with SelectedInnerRow = id }
| Reset -> init
где функция обновления показывает следующую ошибку при «Сбросе -> инициализации»:
Все ветви выражения сопоставления с шаблоном должны возвращать значения того же типа, что и первая ветвь, где здесь ‘Модель’. Эта ветвь возвращает значение типа «a -> ‘b -> Модель’
Что означает «a -> ‘b -> Model» и как это можно исправить?
Спасибо.
TIA
Ответ №1:
Как говорится в сообщении об ошибке: все ветви сопоставления с шаблоном должны возвращать значения одного и того же типа
Ваша Select id -> ...
ветвь возвращает значение типа Model
Ваша Result -> init
ветвь возвращает функцию init
, которая имеет тип 'a -> 'b -> Model
, то есть она принимает два аргумента некоторых типов 'a
'b
и возвращает a Model
.
Типы не совпадают. Разные типы. Видите?
Из семантики я предполагаю, что вы действительно хотите, чтобы ваша update
функция возвращала Model
. Если это так, вам нужно предоставить init
функции два ее аргумента, чтобы она вернула вам a Model
, и это может быть результатом второй ветви выражения сопоставления с шаблоном:
| Result -> init 0 0
ПРИМЕЧАНИЕ: на самом деле я не уверен, что 0 0
в данном случае это правильные аргументы, я просто предполагаю. Невозможно узнать, какими они должны быть, не зная, что Cell.init i j
делает и какой тип аргументов он ожидает.
Вы должны выяснить, какие фактические аргументы init
здесь нужны, и передать их.