types - F# 类型“int list”与类型“int”不匹配
问题描述
我正在尝试构建一个包含斐波那契数列数字的列表,但是当我稍后尝试调用该函数时,它告诉我 int 列表与 int 不匹配,
let rec fibonacci x list =
if List.head list > x then List.tail list
else fibonacci x (List.append (List.head list + (List.head (List.tail list))) list)
let x = 10
let list = [1;2]
let fibonacciList = fibonacci x list
printf "%A" fibonacciList
它说编辑器在倒数第二行的函数调用中。
我是 F# 的新手,我确定这是一个基本定义错误,但我不知道它是什么
解决方案
当您删除对fibonacci
函数的调用时,编译器实际上会显示真正的错误:error FS0071: Type constraint mismatch when applying the default type ''a list' for a type inference variable. The types ''a' and ''a list' cannot be unified. Consider adding further type constraints
这很难理解,但基本上实施有问题。我认为问题在于您使用List.append
. 它应该有两个列表,但你为它提供了一个int
和一个int list
。您可以使用运算符将一项添加到列表的前面::
:
let rec fibonacci x list =
if List.head list > x then List.tail list
else fibonacci x ((List.head list + (List.head (List.tail list))) :: list)
这是一个使用模式匹配来简化代码的等效实现:
let rec fibonacci x list =
match list with
| a :: b :: rest ->
if a > x then b :: rest
else fibonacci x (a + b :: list)
请注意,编译器会警告匹配情况不完整。如果列表少于 2 个项目,此函数将引发异常。
另请注意,这不能正常工作:它不会产生斐波那契数列。我会把它留给你来解决这个问题。
推荐阅读
- c# - 将 RDLC 报告渲染为 pdf 后文本框边框变粗
- python - 扰乱列表中的字符串字母?
- sql - 在 Microsoft SQL 中使用子查询创建 10 个最昂贵产品的列表
- python - 为什么读取整个 hdf5 数据集比读取切片更快
- python - 在 pandas 中读取 XML 文件
- python - 试图导入firebase,但它显示某种语法错误
- wordpress - 店面首页内容在哪里
- typescript - “AuthCredential”类型上不存在属性“accessToken”
- javascript - Heroku 应用程序继续重启 Discord BOT
- javascript - 查找每个文本的文本字母