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
  }
}

另一种选择是实例化一个值。您可以为此使用 aClassManifestClassTag(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]
  }
}

然而,这取决于无参数构造函数的存在。使用 aClassManifest几乎相同。

于 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 回答