2016-12-12 12 views
1

Хотя эта проблема была поймана в коде с использованием shapeless и kind-projector, это поведение можно было бы воспроизвести без них.Неявный не найден для частично применяемого типа

Предположим, у меня есть простой класс для переопределения экземпляров typeclass с неполной реализацией (зеркало 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 
    } 
} 

И некоторые очень простой класс типа, чтобы проверить его

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

Вещи хорошо, если я буду пытаться применить FirstIs частично с помощью псевдонима и получить экземпляр с помощью LiftAll1

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

Но встроенное частичное применение типа приводит к ошибке компиляции

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] 

Как можно было бы найти частично применимые модели в таких ситуациях?

+1

Вы используете '-Ypartial-unification' на 2.12 или 2.11 scale? – Reactormonk

+0

@Reactormonk Как-то я забыл добавить этот вариант в этот проект. Спасибо. Проблема решена. – Odomontois

+0

@Odomontois вы должны ответить на вопрос и пометить его правильно ... вполне приемлемо ответить на ваши собственные вопросы. –

ответ

0

Как предложил @Reactormonk, компилятор was brought to its senses со следующей строки в build.sbt

scalacOptions += "-Ypartial-unification" 

После этого оригинального кусок кода, который близок к

import shapeless._, ops.hlist._ 

LiftAll[FirstIs[Int, ?], HNil] 

был успешно скомпилирован

Проблема AFAIK заключалась в неспособности компилятора scala понять FirstIs[Int,_] как F[_] in suppli ed implicit def без прямого псевдонима типа. К счастью, это было исправлено в последних версиях scala.

 Смежные вопросы

  • Нет связанных вопросов^_^