带记录的F#类型推理奇数行为

Chr*_*tig 2 f# type-inference

我正在学习F#,我正试图解决为什么,当我用正确的类型覆盖推断类型时,它推断出一个不同的类型List.Filter.代码胜过千言万语:

type Account = 
{ account : int
  label : string }

type Journal = 
{ account : int
  period : string
  debit : int
  credit : int }

let outputJournal (journals: Journal List) (account:Account) =
    let filtered = List.filter (fun x -> x.account = account.account) journals
    filtered
Run Code Online (Sandbox Code Playgroud)

我需要根据指定的帐户过滤日记帐列表.但是,该outputJournal函数在journals传递给的参数下输出错误List.filter.错误如下:"类型不匹配.期望'帐户列表'但给出'列表日记'.类型'帐户'与类型'日记''不匹配.

我很困惑为什么会这样,因为我(或者我认为)清楚地试图过滤一份期刊清单.有没有办法我可以覆盖类型推断来做我的意思或以其他方式让我的意图更清楚的编译器(在任一记录中重命名帐户字段是一个选项,但我想避免它)?

非常感激.谢谢.

Joh*_*mer 5

F#中的类型推断从上到下,从左到右严格地进行.

其结果是,当你x.account的编译器猜测称,x是一个Account让您得到错误信息.

要解决这个问题,你可以做两件事

1)注释x的类型

let filtered = List.filter (fun (x:Journal) -> x.account = account.account) journals
Run Code Online (Sandbox Code Playgroud)

2)用管道操作员更改订单(感谢Fyodor)

let filtered = journals |> List.filter (fun x -> x.account = account.account) 
Run Code Online (Sandbox Code Playgroud)

由于类型推断的工作方式,(2)更常见