Skip to content

Instantly share code, notes, and snippets.

View retronym's full-sized avatar

Jason Zaugg retronym

View GitHub Profile
@retronym
retronym / contravariant-implicit-priority.scala
Created December 21, 2009 09:52
Contravariance + Implcicits kills kittens
trait FoldRight[-M[_]]
{
implicit val StreamFoldRight: FoldRight[Stream] = new FoldRight[Stream] {}
implicit val IterableFoldRight: FoldRight[Iterable] = new FoldRight[Iterable] {}
assert(implicitly[FoldRight[Stream]] eq IterableFoldRight) // want StreamFoldRight
}
{
@retronym
retronym / implicit-priority-variance.scala
Created December 21, 2009 12:49
How the Scala compiler prioritises implicits based on return types in the face of variance.
trait A
trait B extends A
trait C extends B
{
trait Covariant[+X]
type Expected = Covariant[A]
type CandidateB = Covariant[B]
type CandidateC = Covariant[C]
implicitly[CandidateB <:< Expected]
@retronym
retronym / implicit-search-oddities.scala
Created January 3, 2010 21:32
Implicit Search Odditiies
// for 2.7.x compatibility
def locally[T](x: T): T = x
def implicitly[T](implicit e: T) = e
object A {
implicit val one = 1
}
object Test {
locally {
@retronym
retronym / encoding-change-scalaz.scala
Created January 6, 2010 10:34
Change File Encodings
import collection.immutable.List
import java.io.{OutputStreamWriter, FileWriter, FileOutputStream, File}
import scala.io.{Source, Codec}
import scalaz._
import Scalaz._
val base = new File("""E:\code\raptor""")
val tree: Tree[Stream[File]] = base.unfoldTree[Stream[File]] {(f: File) =>
val (files, dirs) = f.listFiles.toStream.partition(_.isFile)
@retronym
retronym / show-reflect.scala
Created January 9, 2010 15:05
Reflection Based toString
import util.NameTransformer
def unfold[A](a: A, f: A => Option[A]): Stream[A] = {
Stream.cons(a, f(a).map(unfold(_, f)).getOrElse(Stream.empty))
}
def get[T](f: java.lang.reflect.Field, a: AnyRef): T = {
f.setAccessible(true)
f.get(a).asInstanceOf[T]
}
@retronym
retronym / show-reflect.scala
Created January 9, 2010 15:05
Refection Based toString for Scala
import util.NameTransformer
def unfold[A](a: A, f: A => Option[A]): Stream[A] = {
Stream.cons(a, f(a).map(unfold(_, f)).getOrElse(Stream.empty))
}
def get[T](f: java.lang.reflect.Field, a: AnyRef): T = {
f.setAccessible(true)
f.get(a).asInstanceOf[T]
}
@retronym
retronym / scalaz-compile.log
Created January 9, 2010 22:42
Scalaz Compile Log -- Mark, Please Save Us!
>
> compile
[info]
[info] == scalaz-core / compile ==
[info] Source analysis: 118 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[Classpath = merged classpath (directory classpath: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar
directory classpath: /System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar
directory classpath: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/ui.jar
directory classpath: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/laf.jar
@retronym
retronym / monad-vs-applicative-functor.scala
Created January 18, 2010 18:49
Monad vs Applicative Functor
import scalaz._
import Scalaz._
val o1 = some(1)
val o2 = some(2)
val v1 = o1.<⊛>(o2, (_: Int) + (_: Int))
println(v1)
val v2 = for {
@retronym
retronym / higher-kinded-inference-bug.scala
Created January 23, 2010 18:23
Limitation of Higher Kinded Inference
trait PartialApply1Of2[T[_, _], A] {
type Apply[B] = T[A, B]
}
trait Foo[M[_]]
def foo[M[_]]: Foo[M] = null
// Why can't the type parameter be inferred here?
//
@retronym
retronym / type-equality-check.scala
Created January 24, 2010 11:15
Determing Type Equality
trait T
trait U extends U
implicitly[T =:= T]
// compile error
// implicitly[T =:= U]
def typesEqual[A, B](implicit ev: A =:= B = null) = ev ne null
assert(typesEqual[T, T] == true)
assert(typesEqual[T, U] == false)