2016-12-12 3 views
1

Während dieses Problem in Code mit shapeless und kind-projector gefangen wurde, konnte dieses Verhalten ohne sie reproduziert werden.Implizite nicht gefunden für teilweise angewendet Typ

Angenommen, ich habe eine einfache Typklasse zum Korrigieren von Typklasseninstanzen mit unvollständiger Implementierung (Mirror of LiftAll).

sealed trait LiftAll1[F[_], In] { 
    type Out 
    def instances: Out 
} 

object LiftAll1 { 
    type Aux[F[_], In0, Out0] = LiftAll1[F, In0] {type Out = Out0} 
    implicit def unit[F[_]]: Aux[F, Unit, Unit] = new LiftAll1[F, Unit] { 
    type Out = Unit 
    def instances = Unit 
    } 
} 

Und einige sehr einfache Art Klasse testen

sealed class FirstIs[M, T] 
object FirstIs { 
    implicit def firstIs[M, D]: FirstIs[M, (M, D)] = new FirstIs 
} 

Dinge in Ordnung sind, wenn ich FirstIs teilweise über alias anwenden werde versuchen und erhalten Instanz über LiftAll1

type FirstIsInt[D] = FirstIs[Int, D] 
implicitly[LiftAll1[FirstIsInt, Unit]] 

Aber eine Inline-Teilaussteuerung führt zu einem Kompilierungsfehler

implicitly[LiftAll1[({type lambda[x] = FirstIs[Int, x]})#lambda, Unit]] 
//Error: could not find implicit value for parameter e: LiftAll1[[x]FirstIs[Int,x],Unit] 

Wie konnten in solchen Situationen teilweise angewandte Typklassen gefunden werden?

+1

Verwenden Sie '-Ypartial-unification' auf 2.12 oder 2.11 typelevel scala? – Reactormonk

+0

@Reactormonk Irgendwie habe ich vergessen, diese Option in diesem Projekt hinzuzufügen. Vielen Dank. Das Problem ist gelöst. – Odomontois

+0

@Odomontois sollten Sie die Frage beantworten und sie richtig markieren ... es ist vollkommen akzeptabel, Ihre eigenen Fragen zu SO zu beantworten. –

Antwort

0

Als @Reactormonk vorgeschlagen, den Compiler was brought to its senses mit im build.sbt

scalacOptions += "-Ypartial-unification" 

Nach diesem ursprünglichen Stück Code folgenden Linie, die erfolgreich

kompiliert wurde

import shapeless._, ops.hlist._ 

LiftAll[FirstIs[Int, ?], HNil] 

zu

nahe AFAIK-Problem war in Scala Compiler Unfähigkeit zu verstehen FirstIs[Int,_] als F[_] in Suppli Ed implicit def ohne direkten Typ Alias. Glücklicherweise wurde dies in den neuesten Scala-Implementierungen behoben.

Verwandte Themen