带有记录的 F# 类型推断奇怪行为
F# Type Inference Odd Behavior With Records
我正在学习 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
我需要针对指定帐户过滤期刊列表。但是,outputJournal
函数在传递给 List.filter
的 journals
参数下输出错误。报错如下:"Type mismatch. Expecting a 'Account list' but given a 'List Journal'. The type 'Account' does not match the type 'Journal'".
我很困惑为什么会这样,因为我(或者我认为)清楚地试图过滤期刊列表。有没有一种方法可以覆盖类型推断来执行我的意思,或者让编译器更清楚我的意图(重命名任一记录中的帐户字段是一个选项,但我想避免它)?
非常感谢。谢谢。
F# 中的类型推断严格按照从上到下、从左到右的方式进行。
因此,当您执行 x.account
时,编译器会猜测 x
是一个 Account
,因此您会收到错误消息。
要解决此问题,您可以做两件事
1) 注释x的类型
let filtered = List.filter (fun (x:Journal) -> x.account = account.account) journals
2) 与管道操作员更改顺序(感谢 Fyodor)
let filtered = journals |> List.filter (fun x -> x.account = account.account)
由于类型推断的工作方式,(2) 更为常见
我正在学习 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
我需要针对指定帐户过滤期刊列表。但是,outputJournal
函数在传递给 List.filter
的 journals
参数下输出错误。报错如下:"Type mismatch. Expecting a 'Account list' but given a 'List Journal'. The type 'Account' does not match the type 'Journal'".
我很困惑为什么会这样,因为我(或者我认为)清楚地试图过滤期刊列表。有没有一种方法可以覆盖类型推断来执行我的意思,或者让编译器更清楚我的意图(重命名任一记录中的帐户字段是一个选项,但我想避免它)?
非常感谢。谢谢。
F# 中的类型推断严格按照从上到下、从左到右的方式进行。
因此,当您执行 x.account
时,编译器会猜测 x
是一个 Account
,因此您会收到错误消息。
要解决此问题,您可以做两件事
1) 注释x的类型
let filtered = List.filter (fun (x:Journal) -> x.account = account.account) journals
2) 与管道操作员更改顺序(感谢 Fyodor)
let filtered = journals |> List.filter (fun x -> x.account = account.account)
由于类型推断的工作方式,(2) 更为常见