gpt4 book ai didi

F# 类型推断记录的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 09:20:55 24 4
gpt4 key购买 nike

我正在学习 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函数在 journals 下输出错误参数传递给 List.filter 。错误如下:“类型不匹配。需要“帐户列表”,但给出“列表日记帐”。“帐户”类型与“日记帐”类型不匹配。

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

非常感谢。谢谢。

最佳答案

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# 类型推断记录的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com