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

时间:2018-01-10 21:38:03

标签: standards sml smlnj ml

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

- 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
;

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

由于您在此期间提供了解决方案,因此以下是对此的一些反馈:

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

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

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

    这也使得表达式多余。

  • 正如Matt所指出的,这个函数的类型是('a×'b)list→('b×'a)list ,这意味着你也可以交换对左侧有一个不同的类型('a )而不是右侧('b ),例如:

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