如果編譯器推測出輸入參數的類型,爲什麼不選擇正確版本的重載方法?Math.Max上的F#類型推斷
在這個例子中爲什麼不能選擇正確的Math.Max時使用的類型正確地推斷上的元素進行比較:
let listMax =
List.map2 (fun l r -> Math.Max(l,r)) [2;4] [5;3] //compile error
let listMax2 =
List.map2 (fun (l:int) r -> Math.Max(l,r)) [2;4] [5;3] //no compile error
當然你也可以只使用max函數在這的情況下,但還有很多其他方法沒有本地等價物。
感謝您的回答。我不太明白的是類型推斷在頂部示例中正常工作,l&r被正確識別爲int。那麼爲什麼不能在沒有訂單更改的情況下選擇正確的Max? –
@FsharpPete類型推斷通過改進關於類型的一些初始知識來工作。因此,當它在第一種情況下到達「Math.Max」時,它只知道它們是(通用)類型的一些值''a''和''b'。這不足以解決'Math.Max',所以它記錄一個錯誤,然後完成處理文件的其餘部分 - 它在那裏找到列表,並將''a'和''b''改進爲'int'。在使用'max'的版本中,它的作用是因爲它增加了一個約束條件,即'a'和''b'必須支持最大限度的... –