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

时间:2014-07-27 15:08:27

标签: list f#

运行以下代码的结果返回一个空列表,但我不太清楚为什么。 我的猜测是迭代for循环有一个我还不了解的效果,我知道如果我改变结果列表是可变的,一切正常 请注意 fileNames 游戏之间没有任何关系(即可能有任意数量的游戏或文件,他们不需要一对一匹配)

let createList (fileNames: string list) = 
    let games = [ "DMC";"Aztez"]    
    let result = List.empty<(string * string)>                
    for filename in fileNames do
        for game in games do
            let a = [filename, game] 
            result = result @ a
    result

在两个for循环内的行中有一个警告:&#34;这个表达式应该有&#39; unit&#39;,但是类型为&#39; bool&#39;。使用&#39;忽略&#39;丢弃表达式的结果,或者让&#39;让&#39;将结果绑定到名称。 &#34;

以下代码具有预期的行为

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

但如果我不必使用可变列表会更好。

总而言之,我想知道 a)为什么第一个代码示例结果为空。为什么新值没有附加@(我也试过::) b)有没有更好的方法呢?

由于

1 个答案:

答案 0 :(得分:4)

如警告所示,该行

result = result @ a

评估为bool,表示列表resultresult @ a是否相等。然后丢弃该bool。因此,你的for循环只是迭代两个集合并计算一些从未使用过的bool。

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

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