簡體   English   中英

F#中的類型推斷問題

[英]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編輯器在某種意義上是“猜測”,但是我還沒有看到它猜對了!

我發現必須顯式地提供類型而對為什么需要它們沒有任何好主意,這令人沮喪和失望。 任何幫助,將不勝感激。

在沒有看到pqBoardSolve成員的定義的pqBoard ,很難確定到底發生了什么,但是樣本中b2steps之間的主要區別在於它們的使用方式以及生成方式。

如果是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.

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