簡體   English   中英

在F#中應用折疊功能

[英]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.

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