具有 (’a * ’b) 列表的函数的语法 → (’b * ’a) 列表

Syntax for a function with (’a * ’b) list → (’b * ’a) list

我正在尝试编写一个函数来交换列表中的一对元组,如下所示:

- pairSwap [(1, 2), (3, 4), (5, 6);
 [(2,1),(4,3),(6,5)]

我很难弄清楚在声明函数时我的语法做错了什么。这是我目前所拥有的:

fun pairSwap ((a : 'a, b: 'a) list) : (('a, 'a) list) = 
...
;

我哪里错了?

编辑: 解决方案

fun pairSwap (t : ('a * 'a) list) : ('a * 'a) list = 
  if null t
    then []
  else
    let
      val v = hd t
    in
      (#2 v, #1 v)::pairSwap (tl t)
    end
;

您需要将变量从对类型注释中拉出:

fun pairSwap (arg : ('a * 'b) list) : ('b * 'a) list = ...;

请注意,我也将它从您所拥有的更改为标题要求的内容:('a * 'a) list -> ('a * 'a) list('a * 'b) list -> ('b * 'a) list

由于您同时提供了解决方案,这里有一些反馈:

  • 你真的不需要类型注释。您可以让类型推断完成这项工作。

    fun pairSwap t = ...
    
  • 可以使用nullhdtl,但要考虑模式匹配:

    fun pairSwap [] = []
      | pairSwap ((x,y)::ps) = (y,x)::pairSwap ps
    

    这也使得 let 表达式变得多余。

  • 正如 Matt 指出的那样,此函数的类型是 ('a × 'b) list → ('b × 'a) list,其中意味着您还可以交换左侧类型 ('a) 与右侧类型 ('b) 不同的对,例如:

    - pairSwap [("hello",42),("world",43)];
    val it = [(42,"hello"),(43,"world")] : (int * string) list