В F #, как исправить ошибку сопоставления с шаблоном с типом значения «a-> ‘b-> Модель»

#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 здесь нужны, и передать их.