2016-09-04 8 views
4

私は2つの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) 

私が正しく理解し、私が提供する必要がある場合は、私は暗黙のマッパー を逃すのエラーが出ますmapPoly2ないPoly1を取る:あなたは非常に近いですが、chooseの定義は少し間違っている

答えて

4

ことジップの結果がマッピング可能であるが、私が何をどのように確認していないことを証明。

タプルのhlistをマッピングするので、単一の引数(タプル)を持つ多相関数が必要です。あなたが提供しているのは、代わりに2つの引数を取る多相関数です。違いは微妙ですが、そこにあります。

はここで働くバージョンです:あなたはトリックではなく 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