diff --git a/src/main/scala/com/chobostudy/loustler/error/Option.scala b/src/main/scala/com/chobostudy/loustler/error/Option.scala index c378398..1624366 100644 --- a/src/main/scala/com/chobostudy/loustler/error/Option.scala +++ b/src/main/scala/com/chobostudy/loustler/error/Option.scala @@ -38,3 +38,7 @@ trait Option[+A] { case class Some[+A](get: A) extends Option[A] case object None extends Option[Nothing] + +object Option { + def apply[T](t: T): Option[T] = if (t == null) None else Some(t) +} diff --git a/src/main/scala/com/chobostudy/loustler/error/SolutionP68.scala b/src/main/scala/com/chobostudy/loustler/error/SolutionP68.scala new file mode 100644 index 0000000..04c7c8e --- /dev/null +++ b/src/main/scala/com/chobostudy/loustler/error/SolutionP68.scala @@ -0,0 +1,24 @@ +package com.chobostudy.loustler.error + +import com.chobostudy.loustler.error.Option + +/** + * @author loustler + * @since 11/03/2017 21:19 + */ +trait SolutionP68 { + def mean(xs: Seq[Double]): Option[Double] = { + Option(xs.sum / xs.size) + } + + // exercise 4.2 + def variance(xs: Seq[Double]): Option[Double] = { + Option(xs).flatMap(x => { + val meanV = mean(xs).getOrElse(0.0) + + mean(xs.map(d => math.pow(meanV - d, 2))) + }) + } +} + +object SolutionP68 extends SolutionP68 diff --git a/src/test/scala/com/chobostudy/loustler/error/SolutionP68Test.scala b/src/test/scala/com/chobostudy/loustler/error/SolutionP68Test.scala new file mode 100644 index 0000000..ab87f52 --- /dev/null +++ b/src/test/scala/com/chobostudy/loustler/error/SolutionP68Test.scala @@ -0,0 +1,20 @@ +package com.chobostudy.loustler.error + +import org.scalatest.FunSuite + +/** + * @author loustler + * @since 11/03/2017 21:52 + */ +class SolutionP68Test extends FunSuite { + test("variance should be correct") { + val seq = List(1.0, 1.1, 1.2, 1.3, 1.4) + val mean = seq.sum / seq.size + val variance = seq.map(d => Math.pow(mean - d, 2)).sum / seq.size + val expect = Option(variance) + + val result = SolutionP68.variance(seq) + + assert(result == expect) + } +}