类型推断错误

其余的部分

我有两种类型:

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

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

我想创建一个函数来获取Issue和Id的列表,并使用ID返回列表中第一个元素的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'

为什么以及如何解决?

康拉德·科科萨(Konrad Kokosa)

在表达式中:

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

fun使用情况i推断为Journal(这是包含Id成员的最后一个类型声明)。您可以玩:

  1. 更改Journal.IdId2它将起作用,
  2. 更改Journaland 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章