[英]Applying Fold function in F#
let list_min_fold = List.fold (fun acc -> List.min acc ) 0 lst
printfn"Using regular List.fold function:\n The minimum is: %A\n"
(list_min_fold)
當我執行代碼時,將顯示以下錯誤:錯誤FS0001:類型'('a->'b)'不支持'comparison'約束。 例如,它不支持“ System.IComparable”接口
為什么? 請幫忙 :(
您是否要查找列表中最小的數字? 如果是這樣,則需要使用min
函數(僅使用兩個參數),而不是List.min
(使用參數列表):
為了使代碼與您的示例最相似,可以編寫代碼(還要注意,從0
開始不起作用,所以我改用System.Int32.MaxValue
):
let lst = [4;3;1;2;5;]
let list_min_fold = List.fold (fun acc -> min acc) System.Int32.MaxValue lst
還值得注意的是,傳遞給fold的函數帶有兩個參數-狀態acc
和當前值:
let list_min_fold = List.fold (fun acc v -> min acc v) System.Int32.MaxValue lst
但是由於使用了部分函數應用程序,因此您可以省略其中之一(如您所做的那樣),或者兩者都省略:
let list_min_fold = List.fold min System.Int32.MaxValue lst
像往常一樣,Tomas的答案就在現場,所以我只說一句:
如您所見,嘗試找到一個空列表的最小值沒有任何意義(因此該功能可能應該是'a option
類型,當您有一個非空列表時,使用List.reduce
非常容易(這是基本上,對於二進制運算來說只是fold
,對於這種運算, min
是一個很好的選擇):
let list_min xs =
match xs with
| [] -> None
| _ -> List.reduce min xs
|> Some
這樣您將獲得:
> list_min [2;1;5;3];;
val it : int option = Some 1
> list_min [2;1;5;3;0];;
val it : int option = Some 0
> list_min ([] : int list);;
val it : int option = None
好的,這是一個關於折疊的問題,這很合理-因此,如果必須精確地是List.fold
那么您當然可以做(如TheInnerLight所述):
let list_min xs =
match xs with
| [] -> None
| (x::xs) -> List.fold min x xs
|> Some
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.