Ошибка вывода типа

У меня есть два типа:

type Issue = {
  Id: string;
  Assigned_To: string;
}

type Journal = {
  JournalizedId: string;
  Id: string;
  UserId: string;
}

Я хочу создать функцию, которая получает список проблем и идентификаторов и возвращает поле Assigned_To первого элемента в списке с идентификатором:

let assignedToOfIssueById (id: string) (issues: Issue list): string =
  let issue = List.filter (fun i -> i.Id = id) issues |> List.head
  issue.Assigned_To

я получаю сообщение об ошибке

    let issue = List.filter (fun i -> i.Id = id) issues |> List.head
  -----------------------------------------------^^^^^^

/Users/demas/stdin(14,48): error FS0001: Type mismatch. Expecting a
    Journal list    
but given a
    Issue list    
The type 'Journal' does not match the type 'Issue'

Почему и как я могу это исправить?


person demas    schedule 22.12.2014    source источник


Ответы (1)


В выражении:

List.filter (fun i -> i.Id = id) issues

из fun использования i выводится как Journal (это последнее объявление типа, которое содержит член Id). Вы можете поиграть:

  1. Поменяй Journal.Id на Id2 и все заработает.
  2. Измените порядок Journal и Issue... и все заработает.

Чтобы это исправить, измените эту функцию на (явно указав тип):

let assignedToOfIssueById2 (id : string) (issues : Issue list) : string =
  let issue = List.filter (fun (i : Issue) -> i.Id = id) issues |> List.head
  issue.Assigned_To

или лучше (пусть filter выведет правильный тип из самого списка):

let assignedToOfIssueById2 (id : string) (issues : Issue list) : string =
  let issue = issues |> List.filter (fun i -> i.Id = id) |> List.head
  issue.Assigned_To
person Konrad Kokosa    schedule 22.12.2014