【问题标题】:F#: error creating a list of size nF#:创建大小为 n 的列表时出错
【发布时间】:2018-06-01 19:17:28
【问题描述】:

我正在尝试创建一个大小为 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

【问题讨论】:

  • 您能根据您的输入显示预期的输出吗?
  • 预期输出应为 [1;2;3]
  • List.take 3 data,您可以探索该函数的作用。
  • 好的,但我也在尝试编写一个没有内置功能的函数 b/c 我仍在学习函数式编程
  • @JLRishe 有正确的答案:您遇到了运算符优先级。函数调用比运算符绑定得更紧密,因此您可以执行firstFunction firstParam + secondFunction secondParam 之类的操作并得到您可能期望的结果:这两个函数调用的结果将相加。但是,在您的情况下,您需要 (count+1) 周围的括号。

标签: f# f#-interactive


【解决方案1】:

因此无法运行:

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
    | _ -> []

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多