模式匹配元组列表

时间:2016-10-21 13:18:06

标签: f# pattern-matching

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

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

addTupLst [(1, 2)]

我收到了警告

  

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

是否无法以这种方式对元组列表进行模式匹配,还是会出现其他错误?

2 个答案:

答案 0 :(得分:4)

你刚忘了一对parens

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

addTupLst [(1, 2)]

答案 1 :(得分:2)

问题在于您将该函数声明为'a * 'a list,但您实际想要写的是('a * 'a) list

这就是为什么我不喜欢常见但(IMO)不一致的方式,为某些内置类型使用前缀表示法的类型参数和其余的后缀表示法。我更喜欢将类型写为list<'a * 'a>