2016-01-17 82 views
1

我嘗試不成形HList映射

import shapeless._ 
val ilist = List(1,2,3) ; 
val slist = List("a", "b", "c") ; 
(ilist :: slist :: HNil).map(list: List[_] => list -> list.length) 

和編譯器說,它需要的參數類型的映射功能或提供類型List[_]當它不能找到list值。有一個簡單的映射示例嗎?

沒有與普通斯卡拉沒有這樣的問題列出

val list1 = 1 :: 2 :: Nil; val list2 = 3 :: 4 :: Nil 
    (list1 :: list2 :: Nil) map {list => list -> list.length} 

編譯罰款。

回答

2

我是個不成形的專家,但我確信你可以用~>>做到這一點。事情是map接受Poly,所以你需要一個Poly函數返回一個常量。這是~>>是。

import shapeless._ 
    import poly._ 
    val ilist = List(1,2,3) ; 
    val slist = List("a", "b", "c") ; 

    object fun extends (List ~>> Int) { 
    override def apply[T](f: List[T]): Int = f.size 
    } 

    println((ilist :: slist :: HNil).map(fun)) 

注意,那~>>居然是:

type ~>>[F[_], R] = ~>[F, Const[R]#λ] 
+0

如果我要地圖'HList [字符串 - > F [_]]什麼'?編譯器會拒絕純粹的轉換fun(List〜>> Int)=> fun((String - > List)〜>> Int)'。 –

+0

@ValentinTihomirov不知道我對你的理解是否正確,但是你應該把'PolyN'擴展到更復雜的場景。請參閱https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values,段落的末尾,其中定義了「對象大小」 – Archeg