F#:创建大小为n的列表时出错

时间:2018-05-31 07:13:02

标签: f# f#-interactive

我试图从较大的已创建列表中创建一个大小为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

1 个答案:

答案 0 :(得分:6)

由于这个原因,它无法运行:

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和默认匹配条件进一步简化此操作:< / p>

let rec helper count aList = 
    match aList with
    | head::tail when count < n -> head :: helper (count+1) tail
    | _ -> []