错误FS0752在函数列表中的映射的F#声明中

时间:2011-01-30 14:38:27

标签: f# f#-interactive

我想在相应值列表上执行函数列表:

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] ;; (并行)

3 个答案:

答案 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)

如错误消息所示,您需要向list1list2添加类型注释。一旦你这样做,它工作正常(虽然我建议使用数组而不是列表,因为你随机访问它们。)

答案 2 :(得分:1)

let pmap2 (list1:_ list) (list2:_ list)