Last active
December 14, 2015 05:49
-
-
Save rirakkumya/5037898 to your computer and use it in GitHub Desktop.
サラダの圏のトマト姫をscalaで実装してみた
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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