F#:尝试计算字符串中小写字母的数量时,键入不匹配错误

时间:2018-09-27 02:54:54

标签: count f# type-mismatch

因此,我正在尝试计算字符串中小写字母的数量。像这样:

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

请帮助

1 个答案:

答案 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的行,这样它才成为函数的返回值。