[英]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
參數下輸出錯誤。 錯誤如下:“類型不匹配。期望有“帳戶列表”,但給出了“列表日記帳”。類型“帳戶”與類型“日記帳”不匹配”。
我對為什么這樣做感到困惑,因為我(或者我想)清楚地試圖過濾期刊列表。 有沒有一種方法可以覆蓋類型推斷以執行我的意思,或者使編譯器更清楚我的意圖(在任一記錄中重命名account字段都是一種選擇,但我想避免這種情況)?
非常感激。 謝謝。
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)更常見
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.