3

これは私の前の質問のフォローアップです

次のロジックを (準 Java で) 使用して構成パラメーターを取得するとしますMyParam

文字列 myParam = null

if ((myParam = getFromArgs("MyParam")) != null)
   myParam を返す

if ((myParam = getFromSystemProperties("MyParam")) != null)
   myParam を返す

if ((myParam = getFromUserConfigFile("MyParam")) != null)
   myParam を返す

... // 等々

if (myParam == null)
   error("No MyParam")

このロジックを Scala でコーディングするには? Applicativeここに適用されますか?

4

4 に答える 4

8
List(getFromArgs _, getFromSystemProperties _, getFromUserConfigFile _).map{func=>
  Option(func("MyParam"))
}.reduce(_ orElse _).getOrElse(sys.error("No MyParam"))

チェックアウトscalaオプションのチートシート。オプションは強力です。

于 2012-07-11T15:26:39.847 に答える
5

問題が構文だけの問題である場合、xiefei の答えは正確です。

代わりに、柔軟な構成を本当に探している場合は、https ://github.com/typesafehub/config/ にある Typesafe 構成プロジェクトを暖かく見ることをお勧めします。

于 2012-07-11T15:44:45.043 に答える
3
(
  Option(getFromArgs("MyParam")) orElse
  Option(getFromSystemProperties("MyParam")) orElse
  Option(getFromUserConfigFile("MyParam")) getOrElse
  error("No MyParam")
)
于 2012-07-11T21:48:16.673 に答える
2

上記のコメントで述べたように、これを行うために "First" モノイド インスタンスを使用できますOption(実際には半群のみが必要です)。たとえば、Scalazを使用します。

import scalaz._, Scalaz._

def fo[A](a: A) = Option(a).fst

val param = (
  fo(myParam) |+|
  fo(getFromArgs("MyParam")) |+|
  fo(getFromSystemProperties("MyParam")) |+|
  fo(getFromUserConfigFile("MyParam"))
) getOrElse sys.error("No Param")

標準ライブラリを使用するバージョンよりも必ずしも好ましいとは限りませんorElseが、関連する抽象化が強調されています (このバージョンは遅延であることにも注意してくださいgetX。必要でない場合、呼び出しは行われません)。

于 2012-07-11T16:25:27.503 に答える