运行以下代码的结果返回一个空列表,但我不太清楚为什么。 我的猜测是迭代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)有没有更好的方法呢?
由于
答案 0 :(得分:4)
如警告所示,该行
result = result @ a
评估为bool
,表示列表result
和result @ 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)]