【问题标题】:Pattern match on a list of tuples元组列表上的模式匹配
【发布时间】:2016-10-21 13:18:06
【问题描述】:

如果我想添加元组列表的所有元素,我会收到以下错误

let rec addTupLst (xs: 'a * 'a list) =
    match xs with
    | (a, b) :: rst -> a + b + (addTupLst rst)
    | _ -> 0

addTupLst [(1, 2)]

我收到警告

错误 FS0001:此表达式应具有类型
'a * '一个列表
但这里有类型
'b 列表

不能以这种方式对元组列表进行模式匹配,还是有其他错误?

【问题讨论】:

  • 在元组周围加上括号(xs: ( 'a * 'a ) list)
  • 值得注意的是,您也可以不包含类型注释,编译器会在这种情况下正确推断。
  • @TheQuickBrownFox 好点。我经常发现我在注释方面获得了更多的智能感知帮助,但在这种情况下显然被咬到试图智取编译器

标签: f# pattern-matching


【解决方案1】:

你只是忘记了一对括号

let rec addTupLst (xs: ('a * 'a) list) =
     match xs with
     | (a, b) :: rst -> a + b + (addTupLst rst)
     | _ -> 0

addTupLst [(1, 2)]

【讨论】:

    【解决方案2】:

    问题是你声明函数使用'a * 'a list,但你真正想写的是('a * 'a) list

    这就是为什么我不太喜欢常见但 (IMO) 不一致的风格,即对某些内置类型的类型参数使用前缀表示法,而对其余类型使用后缀表示法,这是原因之一。我更喜欢将类型写成list<'a * 'a>

    【讨论】:

      猜你喜欢
      • 2019-10-12
      • 1970-01-01
      • 2018-11-09
      • 2020-09-25
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2015-05-30
      相关资源
      最近更新 更多