为什么编译器不推断依赖类型?

时间:2019-12-11 06:19:17

标签: scala functional-programming shapeless dependent-type type-level-computation

我正在学习无形,并且对依赖类型有一些误解。这是示例:

public function LetestNews() {
    $result[] = DB::query("SELECT t.* , (SELECT f.Name FROM File f, NewsArticle n WHERE n.ID = t.ID AND n.AttachedImageID = f.ID LIMIT 0,1) as image FROM `SiteTree` t WHERE t.ClassName LIKE '%NewsArticle%' ORDER BY t.LastEdited DESC LIMIT 0,3");

          $masterLocationArray = [];

             foreach( $result as $key => $data ) {
                $locationArray = [];
                foreach($data as $item) {
                    $locationArray[] = $item;
                }

                $masterLocationArray[$key] = $locationArray;
             }

             return $masterLocationArray;
          }

  //For the .ss template file I'm using that code <br/>
      <!-- Letest News Sections -->
            $LetestNews
      <!-- End Latest News Sections -->

在第一种情况下,我不了解编译错误。编译器正确地找到具有object App { trait Converter[A]{ type Output def convert(a: A): Output } implicit def toStringConverter[A]: Converter[A] = new Converter[A] { override type Output = String override def convert(a: A): String = s"Converted value = ${a.toString}" } def getConvertedValue[A](a: A)(implicit converter: Converter[A]) = converter.convert(a) def main(args : Array[String]) { val someValue: String = getConvertedValue(new Object) //compiler error, type mismatch val someValue2 = getConvertedValue(new Object) //fine println(someValue2) //prints the expected value } } 的{​​{1}}的隐式值。因此,它具有推断返回类型implicit def toStringConverter[A]的所有信息。

为什么不编译?有没有一种方法可以在不参数化输出类型的情况下将返回类型推断为override type Output = String

1 个答案:

答案 0 :(得分:3)

您可以通过为toStringConverter指定更精确的返回类型来实现:

implicit def toStringConverter[A]: Converter[A] { type Output = String } = new Converter[A] { ... }

或者根本不指定它,这样就可以推断出上述类型,但是不建议将其用于隐式。

  

编译器正确找到具有覆盖类型Output = String的隐式def toStringConverter [A]的隐式值。因此,它具有推断返回类型String的所有信息。

它不能取决于toStringConverter[A]实现,而只能取决于其类型。