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