3

現在、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")
}

しかし、それは少し冗長すぎます。それを処理するためのより慣用的でエレガントな方法が何であるかを知りたいのですが、理想的には次のようになります(もちろん、疑似コードです!):

val fullName = (name + ", " + surname).getOrElse("unknown")

または同様のもの...

(二重の.getOrElseを回避するだけでよいでしょう...)

4

3 に答える 3

15

これはどう

scala> val fullName = (for(n <-name;s <-surname) yield n + s).getOrElse("unknown")  
fullName: String = unknown
于 2012-06-03T23:53:19.810 に答える
13

同じパターンをさまざまな方法で使用できるため、アプリカティブ ファンクターについて少し学びたいと思うかもしれません。scalaz を使用すると、applicative ビルダーがあります。

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

何が起こっているかは次のとおりです。

(M[A] |@| M[B])(fabc) ~> M[C] //fabc is a function f: (A, B) => C

つまり、関数fは applicative functor の領域に持ち上げられていますM。これはOptionValidationPromiseListStreamおよびその他多くのもので機能するため、特に便利です。つまり、次の式を使用するのと同じです。

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

どこでnamesurnameが両方ともである場合、それらをorOption[String]に切り替えることができ、コードはまったく同じことを行います (使用されているより高い種類に適しています)。これは非常に強力です。ValidationNEL[Exception, String]Promise[String]

于 2012-06-04T00:12:30.017 に答える
2

私はこの方法を見つけました:

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

しかし、それはまだ少し冗長です

于 2012-06-03T23:54:54.847 に答える