매핑

2016-09-04 2 views
4
내가 두 HLists에서 "비어 있지 않은"값을 선택하는 무형의 사용하려고

: 내가 제공해야 제대로 이해하고 내가 암시 매퍼 누락에 오류가매핑

import shapeless.{ HNil, Poly2} 

object choose extends Poly2 { 
    implicit def caseInt = 
    at[Int,Int]{ 
     case (_,n) if n > 0 => n 
     case (o,_) => o 
    } 

    implicit def caseString = 
    at[String,String] { 
     case (_,n) if n.nonEmpty => n 
     case(o,_) => o 
    } 
} 


val g = "a" :: "" :: 0 :: HNil 
val h = "" :: "a" :: 5 :: HNil 

g.zip(h).map(choose) 

mapPoly1 아닌 Poly2 취 증명 우편의 결과가 매핑 가능한하지만 난 당신이 매우 가까운,하지만 choose의 정의는 약간 잘못

답변

4

그렇게하는 방법을 잘 모르겠습니다 그.

튜플의 hlist에 매핑되므로 하나의 인수 (튜플)를 갖는 다형 함수가 필요합니다. 당신이 제공하는 것은 대신 두 가지 인수를 취하는 다형 함수입니다. 차이는 미묘하지만 거기에 있습니다.

다음은 작동 버전 : 당신이 트릭 대신 Poly2Poly1을 확장하고 튜플에 at가지 경우를 정의하고 무엇을 볼 수있는

import shapeless.{ HNil, Poly1 } 

object choose extends Poly1 { 
    implicit def caseInt = 
    at[(Int,Int)]{ 
     case (_,n) if n > 0 => n 
     case (o,_) => o 
    } 

    implicit def caseString = 
    at[(String,String)] { 
     case (_,n) if n.nonEmpty => n 
     case(o,_) => o 
    } 
} 

val g = "a" :: "" :: 0 :: HNil 
val h = "" :: "a" :: 5 :: HNil 

g.zip(h).map(choose) // "a" :: "a" :: 5 :: HNil 

.