Skip to content

Instantly share code, notes, and snippets.

@seraphr
seraphr / 00readme
Last active December 24, 2015 20:29
TypeMember使って実装したGraph
TypeMember使って実装したGraph
generics版 https://gist.github.com/seraphr/6858351
@seraphr
seraphr / 00readme
Last active December 24, 2015 20:29
Generics使って実装したGraph
Generics使って実装したGraph
TypeMember版 https://gist.github.com/seraphr/6858219
@seraphr
seraphr / Structural.scala
Created November 29, 2013 20:41
scala 構造的部分型
trait Hoge{def hoge: String}
def h(a: Hoge) = a.hoge
val hogeInstance: Hoge = new Hoge{def hoge = "hoge"}
val hogeLikeInstance: {def hoge: String} = new {def hoge = "fuga"}
h(hogeInstance) // OK
h(hogeLikeInstance) // NG
@seraphr
seraphr / hasCtor.scala
Created February 17, 2014 22:25
scalaのリフレクションで、コンストラクタの有無を確認するコード
import scala.reflect.runtime.universe._
class TypeCheck[T: WeakTypeTag]{
val mClassType = implicitly[WeakTypeTag[T]].tpe
val mConstructors = mClassType.members.filter(_.isMethod).map(_.asMethod).filter(_.isConstructor)
val mConstructorsParams = mConstructors.map(_.paramss.flatten.map(_.typeSignature))
def of[A: WeakTypeTag](a: A): Boolean = {
@seraphr
seraphr / CtorMacro.scala
Created February 18, 2014 10:36
scalaのdefマクロでコンストラクタ呼び出しコード生成
import scala.reflect.macros.Context
import scala.language.experimental.macros
object InitializeMacro{
def init[T, A, B](a: A, b: B) = macro initImpl[T, A, B]
def initImpl[T: c.WeakTypeTag, A: c.WeakTypeTag ,B: c.WeakTypeTag](c: Context)(a: c.Expr[A], b: c.Expr[B]): c.Expr[T] = {
import c.universe._
val tType = implicitly[WeakTypeTag[T]].tpe
scala> case class Base(id: String, data: String)
defined class Base
scala> case class Merged(id: String, dataList: Seq[String])
defined class Merged
scala>
scala> val tSeq = Seq(Base("c", "c2"), Base("a", "a1"), Base("c", "c3"), Base("a", "a2"), Base("b", "b"), Base("c", "c1"))
tSeq: Seq[Base] = List(Base(c,c2), Base(a,a1), Base(c,c3), Base(a,a2), Base(b,b), Base(c,c1))
@seraphr
seraphr / foldRight.scala
Created July 11, 2015 18:42
foldRightのfoldLeftを用いた実装。 ついでにstackless
def foldRightSimple[A, B](l: List[A])(z: B)(f: (A, B) => B): B = l match {
case Nil => z
case x :: xs => f(x, foldRightSimple(xs)(z)(f))
}
trait Trampoline[T]
case class Done[T](v: T) extends Trampoline[T]
case class Suspend[T](f: () => Trampoline[T]) extends Trampoline[T]
@annotation.tailrec
@seraphr
seraphr / TreeFold.scala
Created July 11, 2015 19:17
Treeのfoldと、それを用いた各種関数実装
trait Tree[A]
case class Leaf[A](v: A) extends Tree[A]
case class Branch[A](l: Tree[A], r: Tree[A]) extends Tree[A]
def fold[A, B](t: Tree[A])(map: A => B, construct: (B, B) => B): B = t match {
case Leaf(v) => map(v)
case Branch(l, r) => construct(fold(l)(map, construct), fold(r)(map, construct))
}
@seraphr
seraphr / OptionTraverse.scala
Created July 12, 2015 06:47
fp in scala EXERCISE 4.5
def traverse[A, B](a: List[A])(f: A => Option[B]): Option[List[B]] = a match {
case x :: xs =>
for {
y <- f(x)
ys <- traverse(xs)(f)
} yield y :: ys
case _ =>
Some(Nil)
}
@seraphr
seraphr / StreamFunctionsViaFoldRight.scala
Last active August 29, 2015 14:24
fp in scala EXERCISE 5.6 foldRightを用いたheadOptionの実装
def foldRight[A, B](s: Stream[A])(z: => B)(f: (A, => B) => B): B = s match {
case x #:: xs => f(x, foldRight(xs)(z)(f))
case _ => z
}
def headOptionViaFoldRight[A](s: Stream[A]): Option[A] = foldRight(s)(None: Option[A]) {
(e, acc) => Some(e)
}
def map[A, B](s: Stream[A])(f: A => B): Stream[B] = foldRight(s)(Stream.empty[B]) {