2016-11-13 70 views
2

我是新的F#的名單最大的元素,我想找到結構的最大元素形式列表:F#發現結構

type Element = struct 
    val X: int 
    val Y: int 
    val RES: int 

    new (x, y, res) = 
    {X = x; Y = y; RES = res;} 

    override this.ToString() = sprintf "%i = %i * %i" this.RES this.X this.Y 
end 

x比y時X.RES> Y.RES大。我寫了一些代碼:

let max2 x y = if x.RES < y.RES then y else x //BAD LINE 

let max_list list = 
    let rec loop hi list = 
     match list with 
     | h::t -> loop (max2 h hi) t 
     | [] -> hi 
    match list with 
    | h::t -> loop h t 
    | [] -> invalidArg "list" "Empty list" 

,並呼籲:

let list = findPalindromes 1 1 List.empty //this call populates the "list" 
printfn "%A" (max_list list) 

這個調用產生2個錯誤(指向x.RESy.RES)的行// BAD LINE:

錯誤FS0072:根據此程序點之前的信息在不確定類型的對象上進行查找。在此程序點之前可能需要類型註釋來約束對象的類型。這可能會使查找得到解決。

我知道我應該將x和y投到Element中,但我試過這樣做,但每次都失敗了。

如何修復此代碼或以其他方式實現此功能?

+0

向我們展示你嘗試過什麼。 –

回答

3

的F#標準庫有此內置– List.maxBy

findPalindromes 1 1 List.empty 
|> List.maxBy (fun e -> e.RES) 
|> printfn "%A" 

至於你與max2得到錯誤,類型註釋解決這個問題:

let max2 (x:Element) (y:Element) = if x.RES < y.RES then y else x