TypeTag를 사용하여 재귀 적으로 함수 호출

드미트리 예 프레 모프

저는 Scala TypeTag를 가지고 놀고 있습니다. TypeTag 매개 변수를 사용하여 함수를 재귀 적으로 호출하고 싶습니다. 다음은 내가하려는 작업의 간단한 예입니다.

import scala.reflect.runtime.universe._

object TypeTagTest extends App {

  def intValue[T](value: T)(implicit tag: TypeTag[T]): Int = {
    tag.tpe match {
      // integer
      case intType if intType <:< typeOf[Int] =>
        value.asInstanceOf[Int]
      // string
      case stringType if stringType <:< typeOf[String] =>
        value.asInstanceOf[String].toInt
      // option of either string or integer
      case optionType @ TypeRef(_, _, typeArg::Nil) if optionType <:< typeOf[Option[_]] =>
        println(s"Unwrapped type is $typeArg")
        val option = value.asInstanceOf[Option[_]]
        option.map { optionValue =>
          // how to pass the typeArg here?
          intValue(optionValue)
        }.getOrElse(0)
    }
  }

  println(intValue(1))
  println(intValue("1"))
  println(intValue(Some("1")))

}

이 코드는 다음을 컴파일하고 실행합니다.

1
1
Exception in thread "main" scala.MatchError: Any (of class scala.reflect.internal.Types$TypeRef$$anon$6)
    at TypeTagTest$.intValue(TypeTagTest.scala:7)
    at TypeTagTest$$anonfun$intValue$2.apply(TypeTagTest.scala:19)
    at TypeTagTest$$anonfun$intValue$2.apply(TypeTagTest.scala:18)
    at scala.Option.map(Option.scala:145)

몇 가지 질문 :

  1. 재귀 호출을 할 때 유형 정보를 전달하는 방법은 무엇입니까?
  2. 이 패턴 일치를 조금 덜 추하게 만드는 방법이 있습니까?

재귀 문제가 아닙니다. "Unwrapped type ..."줄이 인쇄되지 않습니다. 문제는 optionType이 경우 확장 Some[String]되는 엄격한 하위 유형이 아니라는 Option[_]Option[A] forSome {type A}입니다.

이 특정 인스턴스에서 공변 성이기 optionType <:< Option[Any]때문에 여부를 테스트하고 싶을 것 Option입니다. 또는의 첫 번째 인수 TypeRefOption.

이 문제를 수정 한 후에 TypeTag는 항상 컴파일러에 의해 생성되기 때문에 매개 변수 에 대한를 얻을 수 없다고 생각합니다 Type.

def intValueInner(value: Any, tpe: Type) = tpe match {
  ...
  case optionType @ TypeRef(_, _, typeArg::Nil) if optionType <:< typeOf[Option[Any]] =>
    value.asInstanceOf[Option[_]].map(v => intValueInner(v, typeArg)).getOrElse(0)
}
def intValue[T: TypeTag](t: T) = intValueInner(t, typeOf[T])

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

setTimeout을 사용하여 재귀 적으로 함수 호출

분류에서Dev

재귀 적으로 비동기 함수를 호출하는 함수 대기

분류에서Dev

사용자 입력을 위해 함수를 재귀 적으로 호출

분류에서Dev

Promise를 반환하는 비동기 함수를 재귀 적으로 호출

분류에서Dev

자바 : 재귀 호출에서 원래 매개 변수를 사용하여 내 메서드를 재귀 적으로 호출하는 방법

분류에서Dev

다른 매개 변수를 사용하여 bash 스크립트를 재귀 적으로 호출

분류에서Dev

다른 매개 변수를 사용하여 bash 스크립트를 재귀 적으로 호출

분류에서Dev

파이썬 함수는 이름을 저장하는 사전을 사용하여 서로를 재귀 적으로 호출합니다.

분류에서Dev

JS를 사용하여 xml 웹 서비스를 재귀 적으로 호출

분류에서Dev

sudo를 사용할 때 docker 함수가 재귀 적으로 호출되지 않습니까?

분류에서Dev

비동기 함수를 재귀 적으로 호출하는 방법은 무엇입니까?

분류에서Dev

기호 함수를 사용하여 재귀 함수 설치

분류에서Dev

lodash를 사용하여 재귀 적으로 속성 값 수집

분류에서Dev

C : 음수 부호를 사용한 재귀 함수 호출

분류에서Dev

WHILE 루프를 사용할 때 함수를 재귀 적으로 호출하고 제대로 중단하는 방법은 무엇입니까?

분류에서Dev

bash 함수가 지역 변수를 사용하지 않고 자신을 재귀 적으로 호출 할 수있는 이유는 무엇입니까?

분류에서Dev

이 함수를 재귀 적으로 적용하는 방법

분류에서Dev

재귀 함수를 사용하여 파이썬으로 합산

분류에서Dev

여러 재귀 호출을 사용하여 일반 재귀를 꼬리 재귀로 변환

분류에서Dev

재귀를 사용하여 파이썬에서 반복적으로 다른 함수를 호출하는 함수를 작성하려면 어떻게해야합니까?

분류에서Dev

Elixir에서 재귀 함수를 병렬로 호출하는 방법

분류에서Dev

다른 범위 함수를 호출하는 자바 스크립트 함수를 "재귀 적으로"문자열 화하려면 어떻게해야합니까?

분류에서Dev

함수 포인터를 통해 클래스 멤버 함수를 재귀 적으로 호출하려면 어떻게해야합니까?

분류에서Dev

재귀 함수가 호출 된 횟수를 추적합니다.

분류에서Dev

함수를 재귀 적으로 호출 할 때 함수가 새 값이 아닌 이전 값을 반환하는 이유는 무엇입니까?

분류에서Dev

carry를 사용하여 재귀 적으로 2 개의 정수 더하기

분류에서Dev

exec ()를 사용하여 동적으로 비동기 함수 호출

분류에서Dev

앵커 태그를 동적으로 생성하는 동안 재귀 함수가 jquery에서 호출을받지 못함

분류에서Dev

목록에 함수를 재귀 적으로 적용하는 프롤로그

Related 관련 기사

  1. 1

    setTimeout을 사용하여 재귀 적으로 함수 호출

  2. 2

    재귀 적으로 비동기 함수를 호출하는 함수 대기

  3. 3

    사용자 입력을 위해 함수를 재귀 적으로 호출

  4. 4

    Promise를 반환하는 비동기 함수를 재귀 적으로 호출

  5. 5

    자바 : 재귀 호출에서 원래 매개 변수를 사용하여 내 메서드를 재귀 적으로 호출하는 방법

  6. 6

    다른 매개 변수를 사용하여 bash 스크립트를 재귀 적으로 호출

  7. 7

    다른 매개 변수를 사용하여 bash 스크립트를 재귀 적으로 호출

  8. 8

    파이썬 함수는 이름을 저장하는 사전을 사용하여 서로를 재귀 적으로 호출합니다.

  9. 9

    JS를 사용하여 xml 웹 서비스를 재귀 적으로 호출

  10. 10

    sudo를 사용할 때 docker 함수가 재귀 적으로 호출되지 않습니까?

  11. 11

    비동기 함수를 재귀 적으로 호출하는 방법은 무엇입니까?

  12. 12

    기호 함수를 사용하여 재귀 함수 설치

  13. 13

    lodash를 사용하여 재귀 적으로 속성 값 수집

  14. 14

    C : 음수 부호를 사용한 재귀 함수 호출

  15. 15

    WHILE 루프를 사용할 때 함수를 재귀 적으로 호출하고 제대로 중단하는 방법은 무엇입니까?

  16. 16

    bash 함수가 지역 변수를 사용하지 않고 자신을 재귀 적으로 호출 할 수있는 이유는 무엇입니까?

  17. 17

    이 함수를 재귀 적으로 적용하는 방법

  18. 18

    재귀 함수를 사용하여 파이썬으로 합산

  19. 19

    여러 재귀 호출을 사용하여 일반 재귀를 꼬리 재귀로 변환

  20. 20

    재귀를 사용하여 파이썬에서 반복적으로 다른 함수를 호출하는 함수를 작성하려면 어떻게해야합니까?

  21. 21

    Elixir에서 재귀 함수를 병렬로 호출하는 방법

  22. 22

    다른 범위 함수를 호출하는 자바 스크립트 함수를 "재귀 적으로"문자열 화하려면 어떻게해야합니까?

  23. 23

    함수 포인터를 통해 클래스 멤버 함수를 재귀 적으로 호출하려면 어떻게해야합니까?

  24. 24

    재귀 함수가 호출 된 횟수를 추적합니다.

  25. 25

    함수를 재귀 적으로 호출 할 때 함수가 새 값이 아닌 이전 값을 반환하는 이유는 무엇입니까?

  26. 26

    carry를 사용하여 재귀 적으로 2 개의 정수 더하기

  27. 27

    exec ()를 사용하여 동적으로 비동기 함수 호출

  28. 28

    앵커 태그를 동적으로 생성하는 동안 재귀 함수가 jquery에서 호출을받지 못함

  29. 29

    목록에 함수를 재귀 적으로 적용하는 프롤로그

뜨겁다태그

보관