2015-10-15 91 views
1

如何通過set.fold或set.foldback定義一個函數toList等價於set.toList? 我已經做了這個功能,但我很確定它不正確。高級函數toList

let toList predicate items = 
List.foldBack (fun item state -> 
       match predicate item with 
       | false -> state 
       | true -> item::state 
      ) 
       items 
       [] 
//test 
toList (fun x -> x > 0) [-2;-1;0;1;2] 
//output 
//val toList : predicate:('a -> bool) -> items:'a list -> 'a list 
//val it : int list = [1; 2] 

任何提示/幫助?

+0

對於開始嘗試更換'List.foldback'用'Set.foldback' – Petr

+0

你例子似乎工作 - 出了什麼令您滿意? - 順便說一句:這只是'List.filter'現在 – Carsten

回答

1

下面的函數應執行相同Set.toList

let toList set = Set.foldBack (fun it acc -> it::acc) set [] 

使用Set.fold代替Set.foldBack將扭轉結果列表的順序。

您當前的函數將具有基於謂詞過濾列表的效果,相當於List.filter。