首页 > 解决方案 > F#:尝试计算字符串中小写字母的数量时出现类型不匹配错误

问题描述

所以我试图计算字符串中小写字母的数量。像这样:

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

请帮忙

标签: countf#type-mismatch

解决方案


在 F# 中,变量默认是不可变的。这意味着您不能为它们分配新值:count = count+1并不意味着像在其他语言中那样“取 的值count,将其加 1,然后将新值分配给”。count相反,=运算符(当它不是let x = ...声明的一部分时)是比较运算符。所以count = count+1意味着“true如果count等于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条线。表达式的两边if...then...else必须具有相同的类型,并且变量赋值的类型是“无类型”,这是 F# 调用unit的原因,我不会在这里讨论,因为最好在学习新事物时专注于一个概念时间。此外,还有更好的方法(例如某些内置函数)来计算字符串中匹配特定条件的字符数,但同样,一次只计算一个概念。

更新:我忘了提及您的代码需要的另一项更改。您已将lowers函数声明为返回 int 值,但原始代码的最后一行是printf "%d" count,它返回“nothing”(称为 的类型unit)。这就是“期望一个 int 但给定一个单位”错误的来源。要返回 的值count,代码的最后一行需要简单明了count:F# 函数的返回值是函数中最后一个表达式的值。在这里,这就是 的值count,所以函数中的最后一个表达式需要是一个简单的行count,这样它就成为函数的返回值。


推荐阅读