【问题标题】:Swapping tuples of different types in Scala在 Scala 中交换不同类型的元组
【发布时间】:2017-04-08 16:59:47
【问题描述】:

我正在尝试编写一个简单的函数来交换 Scala 中的 (Int, String) 元组。我已经尝试了很多方法,但我不断收到编译器错误,例如:

def swap (p:(Int,String)) : (String,Int) = {
      var s = p._1
      var t = p._2
      var u = (p._2, p.1)
}

[error]  found   : Unit
[error]  required: (String, Int)
[error]     }
[error]     ^
[error] one error found

为什么它一直说它找到了“单位”类型?我尝试了不同的变体,甚至使用了 Scala 内置的“swap”函数,但我不断收到这类错误,说明我的返回类型不是 (String, Int)。任何建议表示赞赏。谢谢!

【问题讨论】:

  • 您的代码有 2 个问题:缺少下划线 _ 并且您有 3 个作业,但您没有返回任何值。
  • 哎呀,下划线,我没有那样运行它,我只是把它放在这里作为我的例子。关于回报 - 我认为 Scala 它会返回我的最后一个任务是什么?
  • 是的,这就是问题所在:您方法中的最后一个表达式是一个赋值,而一个赋值没有值,所以这就是返回的内容:一个表示没有值的值。

标签: scala types


【解决方案1】:

方法的返回值(或更一般地说,any 块的值)是块内最后一个表达式的值。块中的最后一个表达式是

var u = (p._2, p.1)

赋值的值为()(这是Unit 类型的单例值):赋值是副作用,它没有值,并且() 是值(而 Unit 是类型),表示没有值(如果您熟悉 C、C++、D、Objective-C、Objective-C++、Java 或C♯);因此,您的方法返回(),其类型为Unit

这是一种更类似于 Scala 的方式来编写您的方法:

def swap[A, B](p: (A, B)) = (p._2, p._1)

【讨论】:

    【解决方案2】:

    你只需要这个:

    def swap(p: (Int,String)): (String,Int) = (p._2, p._1)
    

    并使其适用于任何元组(大小为 2):

    def swap[A,B](p: (A,B)): (B,A) = (p._2, p._1)
    

    在 Scala 中,函数中的最后一个表达式是返回值。它还支持显式返回表达式,如下所示:

    def swap(p: (Int,String)): (String,Int) = { 
      return (p._2, p._1)
    }
    

    或者更像你想要的:

    def swap(p: (Int,String)): (String,Int) = { 
      val result = (p._2, p._1)
      return result
    }
    

    请记住,不建议使用这种显式返回语法。

    因为 Scala 是一种函数式语言,所以一切都是表达式。表达式是您可以评估并返回结果值的任何东西,作为一个值,它有一个类型。

    即使是你认为更像“陈述”的东西,比如println("a")var a = 1,也是表达式。评估时,它们返回一个无意义/空值,即Unit 类型。因此,您的函数返回最后一条语句,即变量赋值,其值为Unit

    【讨论】:

    • 哇哦,真的这么简单。所以我的问题是我为我的(p._2,p.1)分配了一个var。为什么它会失败?
    • 方法的返回值是方法内部最后一个表达式的值。您的最后一个表达式是一个赋值,但赋值没有价值。事实上,在一种区分表达式和语句的语言中,赋值就是一个语句。 Scala 没有语句,但它有一个值表示缺少值 () 和相应的类型 Unit,这有点类似于非真正的类型伪类型 @ 987654331@ 在类 C 语言中,这是非真正类型的伪类型语句。
    【解决方案3】:

    你也可以使用模式匹配和函数字面量来实现:

    def swap[X,Y]: ((X,Y)) => ((Y,X)) = { case (x, y) => (y, x) }
    

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 2013-03-21
      • 2011-02-17
      • 2010-10-09
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多