【问题标题】:Iterating over two lists and adding to a result list returns an empty list. Why?遍历两个列表并添加到结果列表会返回一个空列表。为什么?
【发布时间】:2014-07-27 15:08:26
【问题描述】:

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

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 循环内的行中有一个警告:“这个表达式应该有 '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

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

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

谢谢

【问题讨论】:

    标签: list f#


    【解决方案1】:

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

    result = result @ a
    

    计算为bool,它指示列表resultresult @ 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)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2017-07-16
      相关资源
      最近更新 更多