如何将Task <mytype>的序列转换为MyType的序列

时间:2019-03-29 13:45:58

标签: f# task saturn-framework

所以我目前有一个fetchGroups类型的序列,我想把它变成XRecord类型的序列。

我当前正在使用TaskBuilder.fs库,根据我的研究,我需要使用let!还是做!对于这种情况,但是他们需要seq<System.Threading.Tasks.Task<Restaurant>>,当与Seq.map一起使用时,它会带回相同的任务类型。

seq<Restaurant>

所以我的结果是task {}类型的,我需要向每个餐厅添加评论,所以我使用Seq.map来获取类型为let joinWithReviews (r : Restaurant) = task { let! reviewResult = Reviews.Database.getByLocationId cnf.connectionString r.Restaurant_Id match reviewResult with | Ok reviewResult -> let restaurant = { r with Reviews = (List.ofSeq reviewResult)} return restaurant | Error ex -> return raise ex } let indexAction (ctx : HttpContext) = task { let (cnf:Config) = Controller.getConfig ctx let! result = Restaurants.Database.getAll cnf.connectionString match result with | Ok result -> let restaurantWithReviews = (Seq.map joinWithReviews result) return index ctx (List.ofSeq restaurantWithReviews) | Error ex -> return raise ex } 的restaurantWithReviews,我将无法使用。

1 个答案:

答案 0 :(得分:2)

.NET方法System.Threading.Tasks.Task.WhenAllseq<Task<'a>>转换为Task<'a[]>。如果您位于let!块中,则可以使用task { }获得结果。

let restaurants: seq<Restaurant>

let! withReviews: Restaurant[] =
    restaurants
    |> Seq.map joinWithReviews
    |> Task.WhenAll