因此,我正在尝试计算字符串中小写字母的数量。像这样:
intput: "hello world"
output: 10
这就是我所拥有的:
let lowers (str : string) : int =
let count = 0
for i=0 to (str.Length-1) do
if (Char.IsLower(str.[i])) then (count = count+1)
else count
printf "%i" count
但是我一直收到此错误:
All branches of an 'if' expression must have the same type. This expression was expected to have type 'bool', but here has type 'int'.
我花了数小时试图弄清楚这个问题,但是一点都没进步。我如何只打印出我拥有的计数值?它还说:
expecting an int but given a unit
请帮助
答案 0 :(得分:1)
在F#中,默认情况下变量是不可变。这意味着您不能为其分配新值:count = count+1
并不意味着“取count
的值,对其加1,然后将该新值分配给count
”,就像它使用其他语言。相反,=
运算符(当它不是let x = ...
声明的一部分时)是 comparison 运算符。因此,count = count+1
的意思是“如果true
等于count
加1,或者count
,如果两个值不相等”。当然,这总是错误的。
您要执行的操作,为变量分配新值,使用false
运算符,并要求首先将变量声明为<-
:
mutable
因此您的代码需要如下所示:
let mutable count = 0
count <- count + 1
要注意的另一件事是我删除了let lowers (str : string) : int =
let mutable count = 0
for i=0 to (str.Length-1) do
if (Char.IsLower(str.[i])) then count <- count+1
count
行。 else count
表达式的两端必须具有相同的类型,并且变量赋值的类型为“ no type”,F#称之为if...then...else
的原因是,我不会在这里讨论,因为最好学习一些新知识,一次专注于一个概念。另外,还有更好的方法(例如某些内置函数)来计算字符串中符合特定条件的字符数,但一次只能计数一个概念。
更新:我忘记提及您的代码需要进行的另一项更改。您已经将unit
函数声明为返回int值,但是原始代码的最后一行是lowers
,它返回“ nothing”(称为printf "%d" count
的类型)。这就是“期望一个整数但给定一个单位”错误的出处。要返回unit
的值,您的代码的最后一行必须为纯count
:F#函数的返回值是函数中 last表达式的值。在这里,这就是count
的值,因此函数中的最后一个表达式必须是仅表示纯count
的行,这样它才成为函数的返回值。