f# - F#:创建大小为 n 的列表时出错
问题描述
我正在尝试从一个更大的、已创建的列表中创建一个大小为 n 的列表。我收到一条错误消息:此值不是函数,无法应用。此表达式的模式匹配不完整。例如,值“[]”可能表示模式未涵盖的情况。在 7,16
谁能帮忙看看我做错了什么?另外,我正在尝试理解 F#,所以我真的不想要任何可以满足我要求的东西,除非它是一种仅供参考的东西。但我仍然需要帮助创建一个函数来做到这一点。
//create a list of size n from beginning of a dataset
let populateList n =
let starterList = []
let data = [1;2;3;4;5;6;7;8]
let rec helper count aList =
let head::tail = aList
if count < k then head :: helper count+1 tail else []
helper 0 data
populateList 3
解决方案
由于以下原因,它无法运行:
head :: helper count+1 tail
因为函数调用具有比中缀+
运算符更高的运算符优先级,这被解释为:
head :: ((helper count) + (1 tail))
由于1
不是函数,因此您在此处遇到错误。
您可以通过添加括号来解决此问题:
head :: helper (count+1) tail
“不完整的模式匹配”警告不会阻止它运行,但它确实表明您应该解决一些问题,因为它可能导致运行时错误。
解决它的正确方法是使用模式匹配来覆盖所有可能的模式:
let rec helper count aList =
match aList with
| head::tail -> if count < n then head :: helper (count+1) tail else []
| [] -> []
这将确保您不会尝试将空列表拆分为头部和尾部。
由于此函数现在[]
在基本情况和aList
为空的情况下都返回,因此您可以通过使用when
和默认匹配条件进一步简化此操作:
let rec helper count aList =
match aList with
| head::tail when count < n -> head :: helper (count+1) tail
| _ -> []
推荐阅读
- angular - @Input 的默认值被测试包装器中的 `undefined` 覆盖
- elasticsearch-7 - '在 [field] 下预期 [START_OBJECT],但得到了 [VALUE_STRING] - 范围聚合 - elasticserch 7.9
- email - 作为发件人,使用 API 或标头,是否可以检测电子邮件是否使用 Gmail 的“计划发送”发送?
- flutter - Flutter 方法在触发另一个方法之前完成
- c# - 如何将当前表单调整为面板数组边界?C# Windows 窗体
- fpga - 只有有限字节的数据通过 fpga 中的 f_read 被读取
- c# - 如何覆盖创建为密封类的默认属性错误消息
- office-js - Office-Add-in-Microsoft-Graph-React Sample example - first try - login is already in progress
- nunit - [Retry] 和 [Repeat] 属性如何在 NUnit 中交互
- android - Google Nearby Connection:文件交换不会传输整个文件