【问题标题】:How to correctly type annotation in F# list of tuple如何在 F# 元组列表中正确键入注释
【发布时间】:2021-02-12 19:26:26
【问题描述】:
let rec matchs  list =
    if list = [] then []
    else
        let hd :: tl = list 
        if fst hd.[0] = "A" 
            then hd:: matchs tl
            else matchs tl

我收到错误 FS0752:运算符 'expr.[idx]' 已根据此程序点之前的信息用于不确定类型的对象。考虑在该行添加更多类型约束:

if fst hd.[0] = "A"  

我尝试了不同的方法来更改参数和列表类型,但问题仍未解决。 我想用这条线测试我的功能

Matchs [("A",5); ("BB",6); ("AA",9); ("A",0)];;

我的函数会将一个字符串与第一个元组元素字符串进行比较,然后将第二个元素添加到新列表中,然后在最后返回列表,但到目前为止我被困在这个问题上。

【问题讨论】:

    标签: f#


    【解决方案1】:

    顺便说一句,这个问题非常适合模式匹配。您可以将 sn-p 中的两个 if 条件替换为单个 match,该 match 使用嵌套模式来识别第一个元素是字符串 "A" 的元组:

    let rec matchs list =
      match list with 
      | [] -> []
      | ("A", _) as hd :: tl -> hd :: matchs tl
      | _::tl -> matchs tl
    

    ("A", _) as hd :: tl 模式意味着你想要的东西是列表 cons 单元格 (_ :: _),你想要将第一个元素命名为 hd 以便你以后可以参考它 (_ as hd),它应该成为一个元组,其中第一件事是一个字符串 "A" ("A", _)。

    【讨论】:

      【解决方案2】:

      撇开非惯用代码,您需要在(fst hd) 周围加上括号,还有.[] 索引序列而不是元组。所以你正在尝试做两件事。

      所以正确的 if 语句应该是 (fst hd) = "A"

      由于重新发明 List.filter 听起来像是一项学校作业,我将在此停止。

      【讨论】:

        猜你喜欢
        • 2011-04-23
        • 2018-10-22
        • 2020-05-02
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 2021-08-13
        • 2018-07-19
        • 1970-01-01
        相关资源
        最近更新 更多