List 在两个列表上迭代并添加到结果列表将返回一个空列表。为什么?

List 在两个列表上迭代并添加到结果列表将返回一个空列表。为什么?,list,f#,List,F#,运行以下代码的结果返回一个空列表,但我不太清楚原因。 我的猜测是,在for循环上迭代会产生一种我还不了解的效果,我知道如果我将结果列表更改为可变的,那么一切都会工作 请注意,文件名和游戏之间没有关系(即可能有任意数量的游戏或文件不需要一一匹配) let createList(文件名:字符串列表)= let games=[“DMC”;“Aztez”] 让result=List.empty 对于文件名中的文件名,请执行以下操作: 为了游戏中的游戏做什么 设a=[文件名,游戏] 结果=结果@a 结果

运行以下代码的结果返回一个空列表,但我不太清楚原因。 我的猜测是,在for循环上迭代会产生一种我还不了解的效果,我知道如果我将结果列表更改为可变的,那么一切都会工作 请注意,文件名和游戏之间没有关系(即可能有任意数量的游戏或文件不需要一一匹配)

let createList(文件名:字符串列表)=
let games=[“DMC”;“Aztez”]
让result=List.empty
对于文件名中的文件名,请执行以下操作:
为了游戏中的游戏做什么
设a=[文件名,游戏]
结果=结果@a
结果
在两个for循环内的行中有一条警告:“此表达式的类型应为'unit',但类型为'bool'。使用'ignore'放弃表达式的结果,或使用'let'将结果绑定到名称。”

下面的代码具有预期的行为

let createListM (fileNames: string list) = 
    let games = [ "DMC";"Aztez"]    
    let mutable result = List.empty<(string * string)>                
    for filename in fileNames do
        for game in games do
            let a = [filename, game] 
            result <- result @ a
    result
让createListM(文件名:字符串列表)=
let games=[“DMC”;“Aztez”]
让可变结果=List.empty
对于文件名中的文件名,请执行以下操作:
为了游戏中的游戏做什么
设a=[文件名,游戏]

结果如警告所示,该线

result = result @ a
计算为
bool
,指示列表
result
result@a
是否相等。然后丢弃此布尔。因此,for循环只需在两个集合上迭代,并计算一些从未使用过的布尔值

您可以使用yield来创建列表,而不是使用可变变量:

let createListM (fileNames: string list) = 
    let games = [ "DMC";"Aztez"]                
    [for filename in fileNames do
        for game in games do
            yield (filename, game)]

正如警告所暗示的,这条线

result = result @ a
计算为
bool
,指示列表
result
result@a
是否相等。然后丢弃此布尔。因此,for循环只需在两个集合上迭代,并计算一些从未使用过的布尔值

您可以使用yield来创建列表,而不是使用可变变量:

let createListM (fileNames: string list) = 
    let games = [ "DMC";"Aztez"]                
    [for filename in fileNames do
        for game in games do
            yield (filename, game)]