我是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,我试图这样做,但每次我都失败了。
如何修复此代码或以其他方式实现此功能?
答案 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