2016-06-30 156 views
2

假設我有容器標記奇怪影響

case class TypedString[T](value: String) 

和局部功能特技

abstract class PartFunc[Actual <: HList] { 
    val poly: Poly 

    def apply[L1 <: HList](l: L1)(implicit 
            mapped: Mapped.Aux[Actual, TypedString, L1], 
            mapper: Mapper[poly.type, L1]): L1 = l 
} 

聚對映射器

object f extends (TypedString ~>> String) { 
    def apply[T](s : TypedString[T]) = s.value 
} 

和結果的方法

用法

例子:

func[ 
    Int :: String :: HNil 
](TypedString[Int]("42") :: TypedString[String]("hello") :: HNil) 

這段代碼在編譯時失敗,因爲編譯器無法找到Mapped隱含參數:

could not find implicit value for parameter mapped: 
    shapeless.ops.hlist.Mapped[shapeless.::[Int,shapeless.::[String,shapeless.HNil]],nottogether.MapperTest.TypedString]{type Out = shapeless.::[nottogether.MapperTest.TypedString[Int],shapeless.::[nottogether.MapperTest.TypedString[String],shapeless.HNil]]} 
     ](TypedString[Int]("42") :: TypedString[String]("hello") :: HNil) 

但是,如果我們從PartFunc.apply(...)簽名刪除Mapper隱含參數一切工作正常。所以我不知道爲什麼以及如何Mapper影響Mapped

回答

3

編譯器抱怨Mapped而實際問題與Mapper。我不知道爲什麼,但似乎有一個Mapped單身類型poly.typepoly是一個抽象值或PartFunc構造參數得到一個錯誤。

一種解決方案是使poly一個P <: Poly並傳遞單用Actual類型一起,當我們創建PartFunc

import shapeless._ 
import ops.hlist.{Mapped, Mapper} 
import poly.~>> 

abstract class PartFunc[Actual <: HList, P <: Poly] { 
    val poly: P 
    def apply[L1 <: HList](l: L1)(implicit 
    mapped: Mapped.Aux[Actual, TypedString, L1], 
    mapper: Mapper[P, L1] 
): mapper.Out = mapper(l) 
} 

def func[Actual <: HList] = new PartFunc[Actual, f.type] { val poly = f } 

或用普通班:

class PartFunc[Actual <: HList, P <: Poly](poly: P) { 
    def apply[L1 <: HList](l: L1)(implicit 
    mapped: Mapped.Aux[Actual, TypedString, L1], 
    mapper: Mapper[P, L1] 
): mapper.Out = mapper(l) 
} 

def func[Actual <: HList] = new PartFunc[Actual, f.type](f) 

請注意,我們現在必須寫mapper(l),因爲l map poly仍然會尋找Mapped[poly.type, L1]

我們現在可以調用func

func[ 
    Int :: String :: HNil 
](TypedString[Int]("42") :: TypedString[String]("hello") :: HNil) 
// String :: String :: HNil = 42 :: hello :: HNil 

我相信有人與一些更深入的Scala的類型系統的知識可以爲我們提供更清楚的解釋,並可能對這個問題的一個更好的解決方案。

+0

我問這個問題在沒有回答的無形迴音室裏。感謝您的支持。 您建議閱讀哪些書或文章以更熟悉scala類型? –