【问题标题】:Syntax for a function with (’a * ’b) list → (’b * ’a) list [duplicate]具有 ('a * 'b) 列表 → ('b * 'a) 列表的函数的语法 [重复]
【发布时间】:2018-06-20 03:48:22
【问题描述】:

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

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

【问题讨论】:

  • 这不是链接问题的欺骗:那是关于映射例如的函数[1,2,3,4][2,1,4,3],而这个是关于映射的函数,例如[(1,2),(3,4)][(2,1),(4,3)]
  • 不,不完全是,但该问题的标题和给出的答案都可以描述这个问题。

标签: standards sml smlnj ml


【解决方案1】:

由于您同时提供了解决方案,以下是一些反馈:

  • 您实际上并不需要类型注释。您可以让类型推断来完成这项工作。

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

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

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

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

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

【讨论】:

  • 感谢您的反馈。这是我第一次在我的一个类中使用 sml,所以我被鼓励使用类型来帮助过渡到 sml 语法。下次我会记住这一点。
【解决方案2】:

你需要把变量从pair类型注解中拉出来:

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

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

【讨论】:

  • 更新了问题以解决另一个问题
  • 知道了!谢谢
猜你喜欢
  • 2012-11-12
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
相关资源
最近更新 更多