[SCALA] 스칼라 튜플에 기능 콤비를 사용?
SCALA스칼라 튜플에 기능 콤비를 사용?
'지도'는 튜플이 합리적인 것 같습니다에 그래서를 사용하여 요소의 수를 유지합니다.
지금까지 내 시도 :
scala> (3,4).map(_*2)
error: value map is not a member of (Int, Int)
(3,4).map(_*2)
^
scala> (3,4).productIterator.map(_*2)
error: value * is not a member of Any
(3,4).productIterator.map(_*2)
^
scala> (3,4).productIterator.map(_.asInstanceOf[Int]*2)
res4: Iterator[Int] = non-empty iterator
scala> (3,4).productIterator.map(_.asInstanceOf[Int]*2).toList
res5: List[Int] = List(6, 8)
그것은 아주 고통스러운 모습 ... 그리고 난 튜플로 다시 변환하려고하기 시작하지 않았습니다. 내가 잘못을하고 있습니까? 도서관이 향상 될 수 있을까요?
해결법
-
==============================
1.무형의 지원 매핑 및 중간 HList 표현을 통해 튜플을 통해 접이식,
무형의 지원 매핑 및 중간 HList 표현을 통해 튜플을 통해 접이식,
샘플 REPL 세션,
scala> import shapeless._ ; import Tuples._ import shapeless._ import Tuples._ scala> object double extends (Int -> Int) (_*2) defined module double scala> (3, 4).hlisted.map(double).tupled res0: (Int, Int) = (6,8)
튜플의 요소는 다른 유형의 어디에 있는지, 유형별 사례와 다형성 기능을 매핑 할 수 있습니다
scala> object frob extends Poly1 { | implicit def caseInt = at[Int](_*2) | implicit def caseString = at[String]("!"+_+"!") | implicit def caseBoolean = at[Boolean](!_) | } defined module frob scala> (23, "foo", false, "bar", 13).hlisted.map(frob).tupled res1: (Int, String, Boolean, String, Int) = (46,!foo!,true,!bar!,26)
최신 정보
볼품 2.0.0-M1 매핑으로 튜플을 통해 직접 지원됩니다. 위의 예는 지금과 같이
scala> import shapeless._, poly._, syntax.std.tuple._ import shapeless._ import poly._ import syntax.std.tuple._ scala> object double extends (Int -> Int) (_*2) defined module double scala> (3, 4) map double res0: (Int, Int) = (6,8) scala> object frob extends Poly1 { | implicit def caseInt = at[Int](_*2) | implicit def caseString = at[String]("!"+_+"!") | implicit def caseBoolean = at[Boolean](!_) | } defined module frob scala> (23, "foo", false, "bar", 13) map frob res1: (Int, String, Boolean, String, Int) = (46,!foo!,true,!bar!,26)
-
==============================
2.지도는 이해가되지 않습니다 그래서 일반적으로, 튜플의 요소 유형은 동일하지 않습니다. 당신은하지만, 특별한 경우를 처리하는 함수를 정의 할 수 있습니다 :
지도는 이해가되지 않습니다 그래서 일반적으로, 튜플의 요소 유형은 동일하지 않습니다. 당신은하지만, 특별한 경우를 처리하는 함수를 정의 할 수 있습니다 :
scala> def map[A, B](as: (A, A))(f: A => B) = as match { case (a1, a2) => (f(a1), f(a2)) } map: [A,B](as: (A, A))(f: (A) => B)(B, B) scala> val p = (1, 2) p: (Int, Int) = (1,2) scala> map(p){ _ * 2 } res1: (Int, Int) = (2,4)
당신은 p.map (_ * 2)으로 이것을 호출하는 포주 내 도서관 패턴을 사용할 수 있습니다.
최신 정보
원소의 종류가 동일하지 않은 경우에도, Tuple2 [A, B]는 bimap 동작으로 매핑 될 수 Bifunctor이다.
scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> val f = (_: Int) * 2 f: (Int) => Int = <function1> scala> val g = (_: String) * 2 g: (String) => String = <function1> scala> f <-: (1, "1") :-> g res12: (Int, String) = (2,11)
업데이트 2
http://gist.github.com/454818
-
==============================
3.매핑 함수는 A => B 복귀 F [B]를 얻는다.
매핑 함수는 A => B 복귀 F [B]를 얻는다.
def map[A, B](f: A => B) : F[B]
retronym가 Tuple2 [A, B]입니다 Bifunctor을 쓴, 그래서 당신은 scalaz 또는 고양이의 bimap 기능도 찾아보실 수 있습니다. bimap는 튜플의 양쪽을 매핑하는 기능입니다 :
def bimap[A, B, C, D](fa: A => C, fb: B => D): Tuple2[C, D]
(일반적 우측 값) 튜플 [A, B]가 2 개 값을 보유하고 있으며 단지 하나의 값에 매핑 될 수 있으므로 단지 왼쪽에 대해 동일한 값을 반환하며 바로 사용 기능은 튜플의 오른쪽 값을 통해지도한다.
(3, 4).bimap(identity, _ * 2)
from https://stackoverflow.com/questions/2339863/use-functional-combinators-on-scala-tuples by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 앞으로의 참조 - 왜이 코드를 컴파일합니까? (0) | 2019.11.09 |
---|---|
[SCALA] java.lang.String의 대 스칼라 문자열 - 형식 유추 (0) | 2019.11.09 |
[SCALA] 스파크 : RDD 모든 가능한 조합의 생산 RDD [(X, X)] [X] (0) | 2019.11.09 |
[SCALA] '이' ''와 어떤 유형 / 차이 명시 자기 참조 (0) | 2019.11.09 |
[SCALA] `##`와`hashCode`의 차이점은 무엇입니까? (0) | 2019.11.09 |