Semigroup[Option[Int]].combine(Option(1), Option(2)) should be(Option(3))
Semigroup의 combine에서 Empty를 가짐
Monoid[String].combineAll(List()) should be("")
map(값을 꺼내어 f를 적용하고 다시 넣는 과정) 을 가짐
val intToString: Int ⇒ String = _.toString
Apply[Option].map(Some(1))(intToString) should be(Some("1"))
val intToString: Int ⇒ String = _.toString
Apply[Option].ap(Some(intToString))(Some(1)) should be(Some("1"))
val addArity2 = (a: Int, b: Int) ⇒ a + b
Apply[Option].ap2(Some(addArity2))(Some(1), Some(2)) should be(Some(3))