gpt4 book ai didi

f# - 函数列表上的映射的 F# 声明中的错误 FS0752

转载 作者:行者123 更新时间:2023-12-04 22:16:18 27 4
gpt4 key购买 nike

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

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): error FS0752: The operator 'expr.[idx]' has been used an object of indeterminate type based on information prior to this program point. Consider adding further type constraints



我想执行: pmap2 conslist [5;8];; (在平行下)

最佳答案

如果你想使用随机访问,那么你应该使用数组。随机访问列表的元素是可行的,但效率低下(它需要从一开始就遍历列表)。使用数组的版本如下所示:

// 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

关于f# - 函数列表上的映射的 F# 声明中的错误 FS0752,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com