[英]Type inference problems in F#
在Visual Studio中使用F#,我發現自己不得不顯式地注釋類型,這是我想要的,也應該是必須的。 我知道一些解決此問題的技術,特別是出色的前向管道算子的使用。 但是,在許多情況下,我無法避免這樣做,其中有些似乎是完全錯誤的。
例如,我具有以下代碼段的F#代碼:
let b = new pqBoard(this)
let b2,steps = b.Solve()
if b2.Solved() then
let cont = steps |> List.exists (fun (s : string) -> s.IndexOf("Contradiction") >= 0 )
第三行生成一條錯誤消息,提示從上一行對Solve方法的調用返回的一對中的第一對需要類型注釋。 但是該對中的第二個元素(字符串列表)很好,並且不需要這樣的注釋。 當從單個調用返回時,類型檢查器看起來如何確定該對中的第二個類型,而不是第一個類型呢?
如下更改第二行可解決此問題:
let (b2 : pqBoard,steps) = b.Solve()
為什么我必須顯式鍵入第一個元素而不是第二個?
此外,在這種情況下以及其他情況下,VS會在工具提示中正確顯示推斷的類型。 我認為VS編輯器在某種意義上是“猜測”,但是我還沒有看到它猜對了!
我發現必須顯式地提供類型而對為什么需要它們沒有任何好主意,這令人沮喪和失望。 任何幫助,將不勝感激。
在沒有看到pqBoard
和Solve
成員的定義的pqBoard
,很難確定到底發生了什么,但是樣本中b2
和steps
之間的主要區別在於它們的使用方式以及生成方式。
如果是steps
,則將其傳遞到List.exists
,該list<'a>
必須對某些'a
使用list<'a>
,並且顯式注釋了函數參數以采用string
,因此類型檢查器可以立即看到steps
必須為鍵入list<string>
。
對於b2
,正在調用成員函數。 帶有名為Solved
的成員函數的類型可能很多,而F#沒有某種方式不知道b2
的類型就無法解決調用這些類型中的哪一種。
總的來說-盡管不是通用的-使用.
在F#中,通常需要在左側添加事物的類型.
在更早的地方明確指定,而不會使用功能更多的結構和類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.