我想在相应值列表上执行函数列表:
let f1 x = x*2;;
let f2 x = x+70;;
let conslist = [f1;f2];;
let pmap2 list1 list2 =
seq { for i in 0..1 do yield async { return list1.[i] list2.[i] } }
|> Async.Parallel
|> Async.RunSynchronously;;
结果:
seq { for i in 0..1 do yield async { return list1.[i] list2.[i] } }
----------------------------------------------^^^^^^^^^
stdin(213,49):错误FS0752: 运算符'expr。[idx]'已被使用了 基于的不确定类型的对象 此计划之前的信息 点。考虑添加更多类型 约束
我想执行:pmap2 conslist [5; 8] ;; (并行)
答案 0 :(得分:9)
如果要使用随机访问,则应使用数组。对列表元素的随机访问将起作用,但效率低下(它需要从头开始迭代列表)。使用数组的版本如下所示:
// Needs to be declared as array
let conslist = [|f1; f2|];;
// Add type annotations to specify that arguments are arrays
let pmap2 (arr1:_[]) (arr2:_[]) =
seq { for i in 0 .. 1 do
yield async { return arr1.[i] arr2.[i] } }
|> Async.Parallel |> Async.RunSynchronously
但是,您也可以使用Seq.zip
函数重写示例以使用任何序列(包括数组和列表)。我认为这个解决方案更优雅,它不会强迫你使用命令式数组(并且它没有性能劣势):
// Works with any sequence type (array, list, etc.)
let pmap2 functions arguments =
seq { for f, arg in Seq.zip functions arguments do
yield async { return f arg } }
|> Async.Parallel |> Async.RunSynchronously
答案 1 :(得分:3)
如错误消息所示,您需要向list1
和list2
添加类型注释。一旦你这样做,它工作正常(虽然我建议使用数组而不是列表,因为你随机访问它们。)
答案 2 :(得分:1)
let pmap2 (list1:_ list) (list2:_ list)