F#查找结构列表中的最大元素

时间:2016-11-13 13:58:32

标签: 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.RES>时,

X大于Y. 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)

此调用在行// BAD LINE中生成2个错误(指向 x.RES y.RES ):

  

错误FS0072:根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。

我知道我应该将x和y投射到Element,我试图这样做,但每次我都失败了。

如何修复此代码或以其他方式实现此功能?

1 个答案:

答案 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