2

Scala で次の関数を検討してください。

def wrapMyFunction[A](foo: =>A):A = {
    try {
        foo
    }
    catch { case e => 
        //Return whatever the "empty" or "default" instance of type A would be,
        //such as 0, "", None, List(), etc.
    }
}

型パラメータ A が与えられた場合、型 A の「空」または「デフォルト」値を取得するにはどうすればよいですか? それは可能ですか?

4

2 に答える 2

6

まあ、技術的には、「デフォルト」値のようなものがないという単純な理由で、それは不可能です。

あなたが与える例はすべてモノイダルゼロなので、Scalaz では次のように書くことができます:

def wrapMyFunction[A : Zero](foo: =>A):A = {
  ...
  catch { case e: Exception => // do not catch all throwables!
    implicitly[Zero[A]].zero
  }
}

もう 1 つの方法は、値をインスタンス化することです。そのために aClassManifestまたは a ClassTag(Scala 2.10.0) を使用できます。例えば:

def wrapMyFunction[A : scala.reflect.ClassTag](foo: => A): A = {
  ...
  catch { case e: Exception =>
    implicitly[scala.reflect.ClassTag[A]].runtimeClass.newInstance.asInstanceOf[A]
  }
}

ただし、それはパラメーターなしのコンストラクターの存在に依存します。a の使い方ClassManifestはほとんど同じです。

于 2013-02-13T05:52:53.000 に答える
0

ダニエルが言ったように、一般的には型の制限なしでは不可能Aです。明示的または暗黙的に、デフォルト値を取るようにメソッドを変更するのはどうですか:

def wrapMyFunction[A](foo: =>A, fallback: =>A):A = ...

また

def wrapMyFunction[A](foo: =>A)(implicit fallback:A):A = ...
于 2013-02-13T06:24:47.203 に答える