Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:如何处理多个参数,这些参数可以是零_Scala_Option_Optional Parameters - Fatal编程技术网

Scala:如何处理多个参数,这些参数可以是零

Scala:如何处理多个参数,这些参数可以是零,scala,option,optional-parameters,Scala,Option,Optional Parameters,现在我有很多参数可以是none,我想给整个表达式指定一个默认值 现在我在做一些事情,比如 var name: Option[String] = None var surname: Option[String] = Some("Smith") val fullName:String = { name.map { name => surname.map { surname => surname + ", " + name }.getOrElse("u

现在我有很多参数可以是none,我想给整个表达式指定一个默认值

现在我在做一些事情,比如

var name: Option[String] = None
var surname: Option[String] = Some("Smith")

val fullName:String = {
  name.map { name => 
    surname.map { surname => 
      surname + ", " + name
    }.getOrElse("unknown")
  }.getOrElse("unknown")
}
但它有点太冗长了。我想知道一种更为惯用和优雅的处理方法是什么,理想情况下是这样的(当然是伪代码!):

或者类似的东西

(只要避免双重的。getOrElse就好了…

这个怎么样

scala> val fullName = (for(n <-name;s <-surname) yield n + s).getOrElse("unknown")  
fullName: String = unknown
scala>val fullName=(对于(n我发现了这种方法:

val fullname = (name, surname) match {
  case (Some(x), Some(y)) => x + ", " + y
  case _ => "unknonw"
}

但是它仍然有点冗长

您可能想了解一些关于应用程序函子的知识,因为相同的模式可以以各种方式使用

(name |@| surname)(_ + _)
发生的事情是这样的:

(M[A] |@| M[B])(fabc) ~> M[C] //fabc is a function f: (A, B) => C
也就是说,函数
f
正被提升到应用程序functor
M
的领域。这尤其有用,因为它与
选项
验证
承诺
列表
等一起工作。也就是说,正如您可能使用的表达式一样:

(name |@| surname)(_ + _)

如果
名称
姓氏
都是
选项[String]
,您可以将它们切换为
验证内尔[Exception,String]
承诺[String]
,代码仍然会做完全相同的事情(适用于使用的更高种类)。这非常强大。

desugared:
姓氏平面图(x=>name-map(x+”,“++”)getOrElse“unknown”
@opensas这里甚至有一个“Person”示例:HTH
(name |@| surname)(_ + _)