count - 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
请帮忙
解决方案
在 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
,这样它就成为函数的返回值。
推荐阅读
- c# - 使用 odbc 驱动程序对弹性表运行参数化查询的正确方法是什么?
- sql - 在 SQL Server 中随机更新表记录
- php - PHP 警告:在第 71 行更新到 php 7.3.X 后出现非法字符串偏移
- html - 将 div 调整为没有“宽度:适合内容”的内容
- javascript - 在循环中更新属性值 - Reactjs
- excel - Excel VBA更改文本框中的文本
- python - Python Pandas - 从一张纸复制数据并附加到另一张纸的末尾
- angular - 如何使用 Jasmine 测试 MatSort
- python - 在情节中迭代数字以创建动画
- g++ - 使用 pthread_create() 创建线程在我的 linux 上不起作用