タグ

ブックマーク / modegramming.blogspot.com (4)

  • [FP] Scalaへの道

    例題勉強会で出たプログラム例をまとめて例題を作りました。 テキストファイル内の欧文単語を単語の長さで以下の三種類に分類してオブジェクトに設定する短 : 3文字以下中 : 7文字以下長 : 8文字以上以下ではこの例題にそって説明していきます。 準備分類した単語を設定するオブジェクトとしてcase classのWordsを中心としたクラスとコンパニオンオブジェクトを用意しました。 例題はテキストファイルを解析して、case class Wordsに解析結果を設定する処理になります。 package sample case class Words( smalls: Vector[String], middles: Vector[String], larges: Vector[String] ) { def +(word: String): Words = { if (word.length <=

    tsu-nera
    tsu-nera 2015/06/29
  • [FP] パイプライン・プログラミング

    関数型プログラミングとは何か? この問は深遠すぎてとてもボクの手には負えませんが、実務的なプラクティスとしてはパイプライン・プログラミングとして考えると分かりやすいのではないかと思います。 そこでScalaでのパイプライン・プログラミングの選択肢を整理してみました。 関数呼び出し関数型プログラミングにおける普通の関数呼び出しもパイプラインと考えることができます。 純粋関数型では副作用は発生しないので、表に見えている関数の引数と復帰値のみで関数の挙動のすべてが表現されているためです。 たとえば以下のプログラムは: h(g(f(1)))以下のようなパイプラインと考えることができます。 Functor文脈を持ったパイプラインはFunctorを使って構成できます。関数呼び出しとの違いは「文脈」を持った計算になるという点です。 ここでいう「文脈」とはパイプラインの裏側で暗黙的に共有、引継ぎされる状態

    tsu-nera
    tsu-nera 2015/06/22
  • クラウド温泉3.0 (10) / map, filter, fold

    クラウド温泉3.0@小樽のセッション「Monadicプログラミング・マニアックス」で使用するスライドのネタ検討その10です。 パイプライン・プログラミングを構成する要素として以下の2つを説明しました。 関数呼び出し (関数によるMonadicプログラミング)Functor (Functor, Functorによる計算文脈)Functorが提供する計算文脈におけるパイプラインでは、一般的にmapメソッドに加えてfilterメソッドとfoldメソッドを使うことができます。たとえばListでは以下のようになります。 scala> List(1, 2, 3).filter(_ % 2 == 1).map(_ * 2).fold(0)(_ + _) res3: Int = 8このようにメソッドをつないでパイプラインを構築することができるわけです。map, filter, foldメソッドは基中の基

    tsu-nera
    tsu-nera 2015/06/05
  • クラウド温泉3.0 (3) / 代数的データ型 on Scala

    クラウド温泉3.0@小樽のセッション「Monadicプログラミング・マニアックス」で使用するスライドのネタ検討その3です。 前回は代数的データ型について考えました。 ボクの非公式理解では、代数的データ型は: 直積の直和の総和です。 代数的データ型は以下のように、オブジェクト指向のインヘリタンスと対置する位置付けにある、関数型のかなり重要な構成要素であることが確認できました。 オブジェクト指向はクラスでインヘリタンス関数型は代数的データ型で選択この代数的データ型ですが、Scalaではケースクラスで実装するのがイディオムになっています。 ケースクラス以下のようにケースクラスPersonを定義します。これがそのまま代数的データ型となります。 scala> case class Person(name: String, age: Int) defined class Person代数的データ型は「

    tsu-nera
    tsu-nera 2014/12/06
    興味深い視点
  • 1