我正在尝试从更大的已创建列表中创建一个大小为n的元素列表.我收到一条错误消息:此值不是函数,无法应用.不完整的模式匹配此表达式.例如,值"[]"可以指示模式未涵盖的情况.在7,16
谁能帮忙看看我做错了什么?另外,我正在努力理解F#,所以我真的不想要任何可以做我要求的东西,除非它是一个FYI的东西.但我仍然需要帮助创建一个功能来做到这一点.
//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
Run Code Online (Sandbox Code Playgroud)
由于这个原因,它无法运行:
head :: helper count+1 tail
Run Code Online (Sandbox Code Playgroud)
因为函数调用具有比中缀+
运算符更高的运算符优先级,所以这被解释为:
head :: ((helper count) + (1 tail))
Run Code Online (Sandbox Code Playgroud)
由于1
不是函数,因此您在此处收到错误.
您可以通过添加括号来解决此问题:
head :: helper (count+1) tail
Run Code Online (Sandbox Code Playgroud)
"不完整模式匹配"警告不会阻止它运行,但它确实表明您应该解决的问题,因为它可能导致运行时错误.
解决这个问题的正确方法是使用模式匹配来覆盖所有可能的模式:
let rec helper count aList =
match aList with
| head::tail -> if count < n then head :: helper (count+1) tail else []
| [] -> []
Run Code Online (Sandbox Code Playgroud)
这将确保您不会尝试将空列表拆分为头部和尾部.
由于此函数现在返回[]
基本情况和aList
空的情况,您可以通过使用when
和默认匹配条件进一步简化此操作:
let rec helper count aList =
match aList with
| head::tail when count < n -> head :: helper (count+1) tail
| _ -> []
Run Code Online (Sandbox Code Playgroud)