这里我有一个功能。在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
答案 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/then
和if/then/else
是表达式,而不是语句(如果您来自C#,{{1就像if x then y else z
)。如果有x ? y : z
子句,那么该分支的类型必须与else
分支的类型匹配,以便整个表达式是良好类型的。如果没有if
,则else
的正文必须具有if
类型,否则结果将被忽略(基本上,unit
是等效的到if x then y
)。