【问题标题】:Type mismatch when passing tuple传递元组时类型不匹配
【发布时间】:2019-03-07 23:59:37
【问题描述】:

以下函数接受一个列表、一个元组 (a, b),其中 'a' 是一个浮点元组和一个要测试的查询。

checkDist 是一个函数,它接受两个浮点数元组并返回所有点之间的距离。

现在,我的问题是我遇到了类型不匹配错误并且无法弄清楚原因。似乎将 infer 'a' 输入为单个浮点数,而不是 float * float。

let intoTp lst (a, b) qry = 
   let rec intoTpLoop lst prevMax =
      match lst with
      | [] -> []
      | (feat, value) :: t ->
         let curr = checkDist feat qry    // current max
         let prev = checkDist prevMax qry // prev max

         // Check to replace top
         if prev < curr then
            let nextMax = (feat, value)
            prevMax :: intoTpLoop t nextMax
         else
            (feat, value) :: intoTpLoop t prevMax

   intoTpLoop lst (a, b)

谢谢,

【问题讨论】:

    标签: f#


    【解决方案1】:

    所以你调用了两次checkDist,第一次传递feat,这是一个单值,第二次传递prevMax,这是一个元组。有你的矛盾。

    当对类型推断发生的情况有疑问时,添加类型注释有助于澄清应该是什么(对推理引擎、对您自己和对我们而言)。

    【讨论】:

    • feat 和 prevMax 在传递给 checkDist 时都是 val float * float。壮举不是一个单一的值,它是一个浮点数的元组。
    • 如果feat 是一个元组,那么prevMax :: intoTpLoop t nextMax 缺少value 部分
    • 我想问题出在这里:| (feat, value) :: t -&gt;应该是| feat :: t -&gt;
    • 是的,你是对的。问题是,feat 和 prevMax 作为相同类型传递给 checkDist,但后来我在构建结果列表时以不同的方式使用它们。
    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2019-07-28
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多