タグ

ブックマーク / kmizu.hatenablog.com (7)

  • JavaプログラマのためのIOモナド - kmizuの日記

    特に説明はしません。IOモナドなんて言っても、別に難しいことではなく、結局やってる事はこんな感じですというのがわかってもらえれば。もちろん、実際のHaskell処理系がこのような実装になっているという意味ではなく、JavaプログラマはこのようなイメージでIOモナドを理解すればいいのではないかという提案に過ぎないので、その点は注意してください。 package iomonad; import java.util.Scanner; public class IOLib { enum Unit{VALUE};//一つしか値を持たない型 public static Unit UNIT = Unit.VALUE; /** * HaskellのIO 'a型に相当 */ public interface IO<A> { /** * IOを「実行」して、A型の値を得る処理. * ユーザが直接呼び出すと参照

    JavaプログラマのためのIOモナド - kmizuの日記
    dann
    dann 2010/01/18
  • scala.Nothingは何のためにあるのか - kmizuの日記

    scala.NothingはScalaのクラス階層における、「一番下」に位置するクラスで全ての型のサブタイプになるが、これが何のためにあるかという点でつまづく人が時々居るようだ。というわけで、scala.Nothingがあると何が嬉しいのかという点をちょっと説明してみようと思う。 例外やエラーを投げる式のような、戻ってこない計算の型として使う たとえば、次のような、階乗を計算する関数factorialを考えてみよう。factorialはnの階乗を計算する関数で、nを引数に取りnの階乗を計算して返す。また、nは0以上の整数でなければならないものとし、0未満の値が引数として渡されたらIllegalArgumentExceptionを投げるものとする。このとき、factorialの定義は、たとえば def factorial(n: Int): Int = { if(n < 0) throw ne

    scala.Nothingは何のためにあるのか - kmizuの日記
    dann
    dann 2009/12/13
  • ScalaでContinuationモナド(改良版) - kmizuの日記

    ScalaでContinuationモナドは、どうにもあまり美しくなかったので、もっとScalaらしく改良してみた。重要な点は、二引数の型コンストラクタCont[R, A]をContinuations[R]の内部クラスContinuation[A]として表現し、flatMap,mapなどはContinuation[A]のメソッドとしたことで、これによって無駄な型注釈をだいぶ省くことができるようになった。 以下、実装コード。 class Continuations[R] { type CC[A] = A => Continuation[Any] def returns[A](a: A) = new Continuation[A](k => k(a)) def callCC[A](f: CC[A] => Continuation[A]): Continuation[A] = { new Con

    ScalaでContinuationモナド(改良版) - kmizuの日記
    dann
    dann 2009/09/27
  • ScalaのコレクションからJavaのコレクションへの変換用ライブラリ - kmizuの日記

    Scala勉強会のときに、誰かから、ScalaのコレクションをJavaのコレクションに変換するためのライブラリって無いの?という質問があって、それに対して、そういうものは無いけど、割とすぐ書けますよ、てな感じで答えたのをふと思い出して、サクっと書いてみた(Scala-sandboxにも既に同様のコードを置いてあるけど、ちょっと違う)。 package example import java.util object ToJavaCollection { class ToJavaListOrSet[A](it :Iterable[A]){ def toJavaList :util.List[A] = { it.foldLeft(new util.ArrayList[A]){(list, e) => list.add(e); list} } def toJavaSet :util.Set[A]

    ScalaのコレクションからJavaのコレクションへの変換用ライブラリ - kmizuの日記
    dann
    dann 2009/08/23
  • forでパターンマッチを使う - kmizuの日記

    あまり知られていないが、実はScalaのfor式の<-の左の部分にはパターンを書くことができる。たとえば、SomeとNoneが入ったリストから、Someな要素だけを抽出してprintするというコードは次のように書くことができる。 val list = List(Some(1), None, Some(3), None, Some(5)) for(Some(v) <- list) println(v)ここで、Noneが来たときの処理が書かれていないことに、アレ?と思われる方が居るかもしれない。この事に対する答えは簡単で、上記のfor式はおおむね次のような、filterによってパターンにマッチする要素だけを抽出する式を間に挟むため、パターンにマッチしない要素は単純に処理されないのだ。 val list = List(Some(1), None, Some(3), None, Some(5))

    forでパターンマッチを使う - kmizuの日記
    dann
    dann 2009/08/23
  • Ruby(1.8)のブロック付きメソッド -> Scalaの高階関数対応表(Enumerable編) - kmizuの日記

    RubyのリファレンスマニュアルのEnumerableの所を読みながら即興で作ったもので、たぶん抜けや間違いなどあると思いますので、ご指摘いただければ幸いです。あと、ScalaにあってRubyに無い高階関数については書いてません。 Ruby Scala Enumerable#all? Iterable#forall Enumerable#any? Iterable#exists Enumerable#collect,map Iterable#map Enumerable#each Iterable#foreach Enumerable#each_with_index なし(List#zipWithIndexを使うことで同様のことは可能) Enumerable#find,detect Iterable#find Enumerable#find_all,select Iterable#filt

    Ruby(1.8)のブロック付きメソッド -> Scalaの高階関数対応表(Enumerable編) - kmizuの日記
  • Re: 勉強帳 (1) - kmizuの日記

    まめめもより。 Scala を勉強してみます。売り文句だけ見てみると 1. 手続き型でも関数型でも書ける 2. 純粋なオブジェクト指向 3. 柔軟な文法で DSL しやすい 4. パターンマッチ 5. 静的型付け (ジェネリクスあり) 6. JVM で動く (Java の資産を活用できる) 以下はチュートリアルやマニュアルを読んで得たいい加減な理解や疑問点を晒すものです。間違ってるところは教えてください。 http://d.hatena.ne.jp/ku-ma-me/20090512/p1 Scalaを初めて調べて見た人の多くが疑問に思う点が網羅されていたので、せっかくなので、ツッコミのネタにさせていただきます。 class 以外に object という構文があるらしくて、特異メソッドつきのオブジェクトみたいなものを定義しているっぽい。それが Java の static メソッドに相当する

    Re: 勉強帳 (1) - kmizuの日記
    dann
    dann 2009/05/16
  • 1