読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

他言語の設計パターンをScalaに導入する

何か型を定義するとき, 私はこのように書くのが好きだ.

object ParamList {
  case class t(unwrap: Seq[(String, String)])
  def fromRequest(req: Request): t = {
    t(req.params.iterator.toSeq)
  }
}
  • tはOCamlでは良く使うパターンだ. だからOCamlのmodule内はtだらけになる. (例: t -> t -> int) これは, そのモジュールがフォーカスしている型を明示するのに役立つ. もし, case class ParamListをobjectの外に定義する形だと, あまりにもParamListがうるさくなる.
  • unwrapというメンバ名は, このように, 既存の型を包む為のnewtype的な型では適切だと思う. こうすると, Seqを取り出してメソッド呼び出しをしたい場合に, paramList.unwrap.find...のように呼ぶことが出来る. これで, 中身を取り出していることが明確になるわけである. このように, メンバ名を処理名にするというパターンは, HaskellMonadから中身を引き剥がすことをunwrapと呼ぶことから拝借した(http://stackoverflow.com/questions/7154518/unwrapping-a-monad)

気に入ったら使ってほしい.