我正在尝试编写一个函数来交换列表中的一对元组,如下所示:
- 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
;
答案 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 = ...
您可以使用null
,hd
和tl
,但请考虑模式匹配:
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