这个表达式应该有类型 unit 但这里有一个类型 'a list

This expression was expected to have type unit but here has a type 'a list

这里我有一个功能。在 List.append [0] free_list 行中,它抱怨 This expression was expected to have type unit but here has a type 'a list,我不清楚它是如何推断出该语句必须具有单位类型的。

let free_list=[]

let find_free_spaces  :List<int>=
   if  1=1                          // The condition is not important
   then  List.append [0] free_list
   free_list

编译器告诉您 List.append [0] free_list return 是 int list 类型的值,但它希望您的 if then 表达式是 unit 类型,因为你没有 else 条件。如果您添加了一个 else 条件,该条件也 return 编辑了一个 int list,编译器错误将变成警告,提示您忽略了表达式的结果。

F# 是一种表达式而不是基于语句的语言,这意味着 if then else... 等 return 值(因此那些 returned 值 必须 在每种情况下都是相同的类型)。

另请记住,F# 列表是不可变的,因此附加列表不会产生向现有列表添加值的副作用,它会创建一个包含原始值和附加值的新列表。

就目前而言,您的代码将采用一个列表,构建一个包含 0 和您提供的列表的新列表,不对该新列表执行任何操作,最后 return 您提供的原始列表.如果你确实想要这种行为(出于某种原因),你可以将 List.append [0] free_list 的结果通过管道传递给 ignore 函数,这将明确表明你忽略了 [=12= 的结果] 表达式。

在 F# 中,if/thenif/then/else 表达式 ,而不是 语句 (如果您要在 C# 中,if x then y else z 类似于 x ? y : z)。如果有一个 else 子句,那么该分支的类型必须与 if 分支的类型相匹配,这样整个表达式才是正确类型的。如果没有 else,那么 if 的主体必须具有类型 unit,否则结果将被忽略(基本上,if x then y 等同于 if x then y else ()).