簡體   English   中英

具有記錄的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.filterjournals參數下輸出錯誤。 錯誤如下:“類型不匹配。期望有“帳戶列表”,但給出了“列表日記帳”。類型“帳戶”與類型“日記帳”不匹配”。

我對為什么這樣做感到困惑,因為我(或者我想)清楚地試圖過濾期刊列表。 有沒有一種方法可以覆蓋類型推斷以執行我的意思,或者使編譯器更清楚我的意圖(在任一記錄中重命名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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM