Skip to content

Instantly share code, notes, and snippets.

extern crate regex;
use regex::Regex;
#[derive(Debug)]
enum ParseResult<T> {
Success { result: T, next: String },
Failure
}
impl<T> ParseResult<T> {

一つの型に対して2つのインスタンスを提供する

  • 値のwrap/unwrapがない
  • インスタンスの定義が単純
  • インスタンスが一意に定まらない

コンパニオンオブジェクトの同一階層に複数のimplicit valueを定義した場合

  • importが必須
  • エラーがわかりづらい(could not find implicit value)
object GADTs {
sealed trait Data1[A]
case class Constructor1() extends Data1[Int]
sealed trait Data2 { type T }
case class Constructor2() extends Data2 { type T = Int }
def f1[A](data: Data1[A]): A = data match { case Constructor1() => 0 }
//def f2[A](data: Data2 { type T = A }): A = data match { case Constructor2() => 0 }
import scala.annotation.tailrec
sealed abstract class Var {
def walk(subst: Subst): Var = {
@tailrec
def go(v: Var, stack: List[Var], acc: Option[Var]): Var =
v match {
case Unbound(k) =>
subst.get(k) match {
import scala.annotation.tailrec
sealed abstract class Queue[U <: Union, -A, +B] {
def apply(a: A): Free[U, B] = {
@tailrec
def go(tpe: { type T })(arrows: Queue[U, tpe.T, B], value: tpe.T): Free[U, B] =
arrows.view match {
case One(f) => f(value)
case cons@Cons() =>
package kits.free
import scala.annotation.tailrec
sealed abstract class Queue[R[_], -A, +B] {
def :+[C](f: B => Free[R, C]): Queue[R, A, C] = new Node(this, new Leaf(f))
def ++[C](that: Queue[R, B, C]): Queue[R, A, C] = new Node(this, that)
import scala.annotation.tailrec
sealed abstract class Queue[F[_], A, B] {
def :+[C](f: B => F[C]): Queue[F, A, C] =
new Node(this, new Leaf(f))
def ++[C](that: Queue[F, B, C]): Queue[F, A, C] =
new Node(this, that)
@tailrec
def go[F[_], A, B](arg: (Queue[F, A, T], Queue[F, T, B]) forSome { type T }): View[F, A, B] = {
arg match {
case (Leaf(v), y) => new Cons(v, y)
case (Node(l, r), y) => go[F, A, B](l, Node(r, y))
}
}

!SLIDE

ScalaとOpenCVとAkka HTTPとReact.jsで作る麻雀点数計算アプリケーション

halcat0x15a

!SLIDE

この資料について