precog / matryoshka

Generalized recursion schemes and traversals for Scala.
Apache License 2.0
811 stars 87 forks source link

implicitly[Recursive[Fix[Option]]] ambiguity between recursiveTRecursive and birecursiveTBirecursive #58

Open klaeufer opened 7 years ago

klaeufer commented 7 years ago

Symptoms

cata and other recursion patterns unavailable for Fix and related types.

scalaVersion := "2.11.8"
"com.slamdata"  %% "matryoshka-core" % "0.16.4",

Causes

Ambiguity between recursiveTRecursive and birecursiveTBirecursive, apparently in top-level package object.

How to reproduce

import matryoshka._
import matryoshka.implicits._
import matryoshka.data.Fix
implicitly[Recursive[Fix[Option]]]

<console>:19: error: ambiguous implicit values:
 both method recursiveTRecursive in package matryoshka of type [T[_[_]], F[_]](implicit evidence$81: matryoshka.RecursiveT[T])matryoshka.Recursive.Aux[T[F],F]
 and method birecursiveTBirecursive in package matryoshka of type [T[_[_]], F[_]](implicit evidence$83: matryoshka.BirecursiveT[T])matryoshka.Birecursive.Aux[T[F],F]
 match expected type matryoshka.Recursive[matryoshka.data.Fix[Option]]
       implicitly[Recursive[Fix[Option]]]
                 ^

Same problem for Mu and Nu.

Workaround

def r(implicit r: BirecursiveT[Fix]) = matryoshka.birecursiveTBirecursive(r)
sellout commented 7 years ago

Thanks, @klaeufer. Currently, this isn’t much of a problem in practice, because it’s rare that you can actually resolve Recursive[T], usually you need Recursive.Aux[T, F], and (unfortunately) you can’t get there from Birecursive.

This is still a problem, though, and will be worse once we get the type class hierarchy working as intended. Prioritizing the implicits should fix it. I’ll do that soon.

klaeufer commented 7 years ago

Thanks, @sellout, I'll keep using the workaround until the prioritized implicits are in place.

klaeufer commented 7 years ago

@sellout This problem went away after I upgraded to Scala 2.12.1 and enabled -Ypartial-unification.

sellout commented 7 years ago

I just ran into this, which reminded me of this issue, and so I’ll actually fix it now 😆 (Although I hope it’s not gotten in your way in the mean time.)