2013-02-13 3 views
2

스칼라에서 다음과 같은 기능을 고려 파라미터 화 된 형태의 반환 기본값 :스칼라 :

유형 매개 변수 주어진
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의 "빈"또는 "기본"값을받을 수 있나요? 심지어 가능할까요?

+0

을 때때로'_'는 것이다 그러나 나는 확실하지 않다 "기본값"에 대한 설 수 제네릭의 경우 작동합니다. –

답변

5

기술적으로는 "기본"값과 같은 것이 없다는 단순한 이유 때문에 기술적으로 불가능합니다. 당신이 제공

예는 Scalaz와 함께, 당신이 쓸 수있는 모든 monoidal 제로, 그래서 :

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

또 다른 대안이 값을 인스턴스화하는 것입니다. ClassManifest 또는 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] 
    } 
} 

그러나 매개 변수없는 생성자가 있는지 여부에 따라 달라집니다. ClassManifest을 사용하는 것은 거의 동일합니다.

+0

모나이드가 모나비가 아니라 반대로 말합니까? 또한, 나는 scalaz-seven에서'Zero'가 삭제되었다고 확신합니다.'Monoid' 인스턴스를 사용할 수 있어야합니다. –

+0

@KristianDomagala 미안합니다. 예, '제로 (Zero)'가 '모노 이드 (Monoid)'와 더 이상 분리되어 있지 않다고 들었지만, 스칼라즈 7은 아직 나오지 않았습니다. –

0

Daniel이 말했듯이 A에 대한 일부 유형 제한이 없으면 일반적으로 가능하지 않습니다. 명시 적으로 또는 암시 적으로, 디폴트 값을하는 방법을 변화에 대해 무엇을 :

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

또는

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