Skip to content

Instantly share code, notes, and snippets.

@rirakkumya
Last active December 14, 2015 05:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rirakkumya/5037898 to your computer and use it in GitHub Desktop.
Save rirakkumya/5037898 to your computer and use it in GitHub Desktop.
サラダの圏のトマト姫をscalaで実装してみた
trait サラダ圏 {
//対象を定義
sealed trait Salad
//マヨサラダ
case class MaSalad(sa: Salad) extends Salad
//ツナサラダ
case class TuSalad(sa: Salad) extends Salad
//ツナマヨサラダ
case class TuMaSalad(sa: Salad) extends Salad
//射を定義
object Salad {
//マヨ射
def ma: Salad => MaSalad = MaSalad(_)
//ツナ射
def tu: Salad => TuSalad = TuSalad(_)
//合成 出来る物は同じだけどトッピングの順番が違う
//ツナマヨ射
def tuma: Salad => TuMaSalad = Salad.tu andThen TuSalad.ma
//マヨツナ射
def matu: Salad => TuMaSalad = Salad.ma andThen MaSalad.tu
}
object MaSalad {
def tu: MaSalad => TuMaSalad = TuMaSalad(_)
}
object TuSalad {
def ma: TuSalad => TuMaSalad = TuMaSalad(_)
}
}
object トマト姫 extends サラダ圏 {
case class トマト(産地: String)
case class トマトサラダ(t: トマト) extends Salad
implicit def t2s(t: トマト): Salad = トマトサラダ(t)
}
object 大根姫 extends サラダ圏 {
case class 大根(産地: String)
case class 大根サラダ(d: 大根) extends Salad
implicit def d2s(d: 大根): Salad = 大根サラダ(d)
}
object DkExec extends App {
def title(s: String) = s"\n== $s =="
//いつものやつ
def fmap[A, B](f: A => B): Option[A] => Option[B] = _ map f
{
println(title("トマトサラダを作ってみる"))
import トマト姫._
val s: Option[Salad] = Some(トマト("熊本"))
fmap(Salad.ma)(s) foreach println
fmap(Salad.tuma)(s) foreach println
}
{
println(title("大根サラダを作ってみる"))
import 大根姫._
val s: Option[Salad] = Some(大根("中国"))
fmap(Salad.ma)(s) foreach println
fmap(Salad.tuma)(s) foreach println
}
{
println(title("産地を偽装してみる"))
import 大根姫._
val s: Option[Salad] = Some(大根("中国"))
val gisou: Salad => Salad = (_) => 大根("鹿児島")
val gisouSaladad = gisou andThen Salad.tuma
fmap(gisouSaladad)(s) foreach println
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment