该表达式应该具有类型单元,但这里有一个类型'列表

时间:2015-12-16 15:00:02

标签: f# unit-type

这里我有一个功能。在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

2 个答案:

答案 0 :(得分:4)

编译器告诉您List.append [0] free_list返回int list类型的值,但它希望您的if then表达式为unit类型,因为您没有{{1}条件。如果您添加了else条件并且还返回了else,则编译器错误将成为您忽略表达式结果的警告。

F#是一种表达式而不是基于语句的语言,这意味着int list等返回值(因此返回的值必须在每种情况下都是相同的类型)。

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

按照目前的情况,您的代码将采用一个列表,构建一个包含0的新列表以及您提供的列表,不对该新列表执行任何操作,最后返回您提供的原始列表。如果你确实想要这种行为(出于某种原因),你可以将if then else...的结果传递给List.append [0] free_list函数,这样就可以明确表示你忽略了{{1}的结果。表达。

答案 1 :(得分:2)

在F#中,if/thenif/then/else表达式,而不是语句(如果您来自C#,{{1就像if x then y else z)。如果有x ? y : z子句,那么该分支的类型必须与else分支的类型匹配,以便整个表达式是良好类型的。如果没有if,则else的正文必须具有if类型,否则结果将被忽略(基本上,unit是等效的到if x then y)。