Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

IT勉強会での初プレゼンなどお助けします!

勉強会でスピーカーをやりたいけど、プレゼンが初めて、苦手という方に無償でコーチできます。スライドのレビューや録画したリハへのアドバイスなどなど。Twitter@jyukutyoまでメンションでもDMでもお気軽にご連絡ください。

私はIT講師の経験があり、プレゼンはデブサミやJJUG CCCなど200人規模の経験が豊富で最大800人の前でプレゼンしました。海外ではDevoxxUSで。デブサミ2017では公募スピーカー1位、デブサミ関西2012アワードで5位となりました。

ScalaのAdvanced Exampleを写経する(10)-functional quicksort

クイックソートの関数スタイル版。

sort1.scala | The Scala Programming Language

package sample.snippet

/** Quick sort, functional style. */
object sort1 {

  def sort(a: List[Int]): List[Int] = {
    if( a.length < 2)
      a
    else {
      val pivot = a(a.length / 2)
      
/*      sort(a.filter(_ < pivot)) :::
        a.filter(_ == pivot) :::
        sort(a.filter(_ > pivot))
*/      
      sort(a.filter(b => b < pivot)) :::
        a.filter(b => b == pivot) :::
        sort(a.filter(b => b > pivot))
    }
  }
  
  def main(args: Array[String]) {
    val xs = List(6, 2, 8, 5, 1)
    println(xs)
    println(sort(xs))
  }
}

エレガント。
命令型と比較してもコード量も少ないしわかりやすい。
関数型の考え方で重要な1つが再帰なのかな。
関数スタイルでは必ず再帰が出てくる気がする。


List#filter()はこんなの。

ilter (p : (A) => Boolean) : List[A]
Returns all the elements of this list that satisfy the predicate p. The order of the elements is preserved. It is guarenteed that the receiver list itself is returned iff all its elements satisfy the predicate `p'. Hence the following equality is valid: (xs filter p) eq xs == xs forall p

Scala Library

filterにはBooleanを返す関数を渡す。

sort(a.filter(_ < pivot))

sort(a.filter(b => b < pivot))

は同じ意味。
「_」は引数を表す。簡潔に書ける。


実行結果。

List(6, 2, 8, 5, 1)
List(1, 2, 5, 6, 8)