2016-10-27 94 views
1

說我有三個領域特定語言我想使用:免費單子 - 隱進樣嵌套使用上積貓

sealed trait Test1Op[A] 
sealed trait Test2Op[A] 
sealed trait Test3Op[A] 

object Test1Op { 
    case class Test1() extends Test1Op[String] 
} 

object Test2Op { 
    case class Test2() extends Test2Op[String] 
} 

object Test3Op { 
    case class Test3() extends Test3Op[String] 
} 

最終組成是:

type Api[A] = Coproduct[Test1Op, Coproduct[Test2Op, Test3Op, ?], A] 

來利用它,我需要適當的Inject情況下(我相信我應該能夠得到暗示,因爲它只有兩個領域特定語言和一個副產品):

implicit val inj1: Inject[Test1Op, Api] = implicitly 
    implicit val inj2: Inject[Test2Op, Api] = implicitly 
    implicit val inj3: Inject[Test3Op, Api] = implicitly 

這個編譯好。但是在運行時它們都是null

//編輯:

上述問題似乎標誌着這些瓦爾斯如implicit(導致遞歸分辨率)。除去implicit後它似乎顯示正確的錯誤,這是:

錯誤:(28,36)不明確的隱式的值: 在類型=> scala.collection.generic.CanBuildFrom的對象PREDEF [字符串兩者值StringCanBuildFrom,炭,字符串] 和方法$符合在種類型的目標PREDEF [A] => <:< [A,A] 匹配預期類型T DEF INJ1:注射[Test1Op,API] =隱含

錯誤:(28,36)找不到參數e的隱含值:T DEF INJ1:注射[Test1Op,API] =隱含

錯誤:(28,36)型不匹配; 發現:單位 需要:cats.free.Inject [com.example.Test1Op,com.example.Hello.Api] DEF INJ1:注射[Test1Op,API] =隱含

回答

1

像往常一樣,發現溶液僅數問一個問題分鐘後:

  1. 刪除implicit(見問題編輯)
  2. Api[A]類型:

    type PartialApi[A] = Coproduct[Test2Op, Test3Op, A] 
    type Api[A] = Coproduct[Test1Op, PartialApi, A] 
    
  3. 工作隱含收益Inject