Arrays 在F数组上应用函数
您好,我正在尝试学习F中CPU绑定并行编程的基础知识。这里我有一个计算饮料价格的函数。我想要的是应用另一个函数,将结果乘以某个数字,再乘以我从并行计算中得到的结果,但是我不断得到类型不匹配的错误。在我的解决方案中,我得到的结果是一个锯齿状数组。不幸的是,我也不知道如何以数组的形式获得结果 我认为代码的第一个问题是grandTotal函数有两个参数:Arrays 在F数组上应用函数,arrays,f#,Arrays,F#,您好,我正在尝试学习F中CPU绑定并行编程的基础知识。这里我有一个计算饮料价格的函数。我想要的是应用另一个函数,将结果乘以某个数字,再乘以我从并行计算中得到的结果,但是我不断得到类型不匹配的错误。在我的解决方案中,我得到的结果是一个锯齿状数组。不幸的是,我也不知道如何以数组的形式获得结果 我认为代码的第一个问题是grandTotal函数有两个参数: let grandTotal (dr:liquid ,cont:Containment) = function (*let temp =
let grandTotal (dr:liquid ,cont:Containment) = function
(*let temp = {dra=dr;conta = cont} //supossed to search on menu list if such item exists (can't figure the syntax)
if List.contains temp menuList then *)
|CupDrink (s=z) -> findPricePrML dr * find z
|BottledDrink (s=z) -> findPricePrML dr * find z
|CannedDrink (s=z) -> findPricePrML dr * find z
|_-> failwith "not found"
(* else failwith "no such item exists"*)
;;
let source = [|(CocaCola, bigBottle); (CocaCola, smallCup); (Tuborg, smallCup)|]
let Test =
Async.Parallel [ async { return Array.map grandTotal source } ]
|> Async.RunSynchronously
这意味着你必须用像grandTotal CocaCola,bigBottle drinkKind这样的名字来称呼它。但是,在尝试调用此函数的代码中,可以使用:
let grandTotal (dr:liquid, cont:Containment) = function
| ...
这将只使用一个参数调用grandTotal—源列表中的一个项目,因此您将返回一个函数而不是价格。您可能需要以下内容:
Array.map grandTotal source
Array.map (fun drink -> grandTotal drink kind) source
第二个问题是,您并没有真正将任何东西并行化。按照使用异步的方式,您只需创建一个计算,然后在后台线程上运行该计算。你可以这样做:
Array.map grandTotal source
Array.map (fun drink -> grandTotal drink kind) source
但是,更有效、更简单的方法是使用Array.Parallel.map:
要回答您关于调用另一个函数的问题,如果没有看到我们可以运行的更完整的代码示例,这是不可能的
Array.Parallel.map (fun drink -> grandTotal drink kind) source