Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops F#嵌套List.iter调用_Loops_F#_Iterator_Nested - Fatal编程技术网

Loops F#嵌套List.iter调用

Loops F#嵌套List.iter调用,loops,f#,iterator,nested,Loops,F#,Iterator,Nested,我有一个F#函数,我想尝试改变一些参数并测试所有这些组合。这是正确的方法吗?(括号有点密集…): 所以我想上传3x5x2=30个结果,并且写得很好。谢谢你的建议 对于上传结果这样纯粹的命令式操作,我真的不会太担心。在您的代码示例中使用List.iter可以实现这一目的。我可能更喜欢for循环,因为很明显,这段代码具有重要的副作用: let MyFunc a b c x y z = 42 let UploadResult a b c x y z q = printfn "%A

我有一个F#函数,我想尝试改变一些参数并测试所有这些组合。这是正确的方法吗?(括号有点密集…):


所以我想上传3x5x2=30个结果,并且写得很好。谢谢你的建议

对于上传结果这样纯粹的命令式操作,我真的不会太担心。在您的代码示例中使用
List.iter
可以实现这一目的。我可能更喜欢
for
循环,因为很明显,这段代码具有重要的副作用:

let MyFunc a b c x y z = 
    42

let UploadResult a b c x y z q =
    printfn "%A %A %A %A %A %A %A" a b c x y z q

let a = 5.0
let b = 0
let c = System.DateTime.Today
let xList = [-1.0; 0.0; 1.0]
let yList = [2; 4; 6; 8; 10]
let zList = [0.1; 0.001]

let perm xs ys zs =
    [for x in xs do
        for y in ys do 
            for z in zs do
                yield x,y,z]
let f (x,y,z) = MyFunc a b c  x y z |> UploadResult a b c  x y z
perm xList yList zList |> List.iter f
for x in xList do
  for y in yList do
    for z in zList do
      MyFunc a b c x y z |> UploadResult a b c x y z
如果您想做一些聪明的事情,可以编写一个函数,从两个列表中生成所有参数组合:

let product xl yl = 
  seq { for x in xl do
          for y in yl do
            yield x, y }
好的是,您还可以多次使用它:
product xList(product yList zList)
。这将返回可以再次迭代的元组列表:

for (x,y), z in product (product xList yList) zList do
    MyFunc a b c x y z 
    |> UploadResult a b c x y z

这不太好的一点是,最终会得到嵌套的元组-这就是为什么我可能只使用普通循环的原因。(或者如果您总是有3个列表,那么另一个答案中的解决方案类似于
产品
,但针对3个列表进行了优化)

对于上传结果等纯命令式操作,我真的不会太担心。在您的代码示例中使用
List.iter
可以实现这一目的。我可能更喜欢
for
循环,因为很明显,这段代码具有重要的副作用:

for x in xList do
  for y in yList do
    for z in zList do
      MyFunc a b c x y z |> UploadResult a b c x y z
如果您想做一些聪明的事情,可以编写一个函数,从两个列表中生成所有参数组合:

let product xl yl = 
  seq { for x in xl do
          for y in yl do
            yield x, y }
好的是,您还可以多次使用它:
product xList(product yList zList)
。这将返回可以再次迭代的元组列表:

for (x,y), z in product (product xList yList) zList do
    MyFunc a b c x y z 
    |> UploadResult a b c x y z

这不太好的一点是,最终会得到嵌套的元组-这就是为什么我可能只使用普通循环的原因。(或者如果您总是有3个列表,那么另一个答案中的解决方案类似于
产品
,但针对3个列表进行了优化)

事实上,您的主要目标是创建多个列表的交叉积(或笛卡尔积),在F#开发人员中有几个被视为“良好实践”的选项:

一,。(删除了
-理解,因为其他答案已经表明了这一点)

2。使用计算表达式(在函数式编程的其他领域,它通常被称为Monad):

三,。如果您只关心括号,请使用高优先级的右关联后向管道()

让内联(^List.iter^
yList |>List.iter^
zList |>List.iter^
MyFunc a b c x y z
|>上传结果a b c x y z
|>忽略

事实上,您的主要目标是创建多个列表的叉积(或笛卡尔积),在F#开发者中有几个被认为是“良好实践”的选项:

1.(删除了
-理解,因为其他答案已经暗示了这一点)

2.使用计算表达式(在函数式编程的其他领域,它通常被称为Monad):

3.如果您只关心括号,请使用高优先级的右关联后向管道()

让内联(^List.iter^
yList |>List.iter^
zList |>List.iter^
MyFunc a b c x y z
|>上传结果a b c x y z
|>忽略

问题是什么,还是您只想查看一下代码?(在这种情况下,您可以先清理一下-例如
Let a=5.0
将不起作用(语法错误),并且您的缩进太差了。在尝试运行我的草稿之前,我已经提前发布了一点,因为应用程序相当大(IDE至少没有抱怨)。但我希望从总体上问一下嵌套List.iter是否是惯用的方法(就像我本能地用另一种语言编写嵌套For循环一样).nested for loops在这里也会起作用;可以做的是在LoopingTanks之前在两个函数中都部分应用a、b和c。上面的问题可能太明显了,不必费心去问。但对于F#来说,我常常是新手。看到新的聪明的方法,我感到惊讶和印象深刻。问题是什么?还是您只想查看代码?(在这种情况下,你可以先清理一下——例如,
Let a=5.0
不起作用(语法错误),而且你的缩进太离谱了。在开始尝试运行我的草稿之前,我已经在发帖方面领先了一点,因为应用程序太大了(至少IDE没有抱怨).但我希望笼统地问一下nested List.iter是否是惯用方法(就像我会本能地用另一种语言编写nested For循环一样).nested for loops在这里也会起作用;可以做的是在LoopingTanks之前在两个函数中都部分应用a、b和c。上面的内容可能太明显了,不必费心去问。但对于F#来说,我经常是新手。看到新的聪明方法,我感到惊讶和印象深刻。感谢F#S的回复。我很高兴已经得到了3个有用的答案,而且它会很有用很难挑出一个。我自动假设使用For循环意味着按项迭代,我知道这是不规则的。你的用法很有启发性。再次感谢。感谢你的回复。我很感激已经得到3个有用的答案,很难挑出一个。我自动假设使用For循环意味着迭代按项目,我知道这很不自然。你的用法很有启发性。再次感谢。感谢托马斯给我的另一个有见地的回复。我需要仔细研究一下你的“产品”和“功能性”的“烫发”中稍微不同的语法细节。谢谢Tomas的另一个有见地的回复。我需要仔细研究一下“产品”和“功能”的“perm”中稍微不同的语法。非常感谢bytebuster。我很高兴你提到了计算表达式。我很高兴
let ret03 =
    xList  |> List.iter ^<| fun x ->
    yList  |> List.iter ^<| fun y ->
    zList  |> List.iter ^<| fun z ->
        MyFunc a b c x y z
        |> UploadResult a b c x y z
        |> ignore