Грешка при извеждане на типа

Имам два вида:

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