2011-01-01から1ヶ月間の記事一覧

.NETのO/RマッパーSomaを作り変え中

C#で作っていたのですが、F#が面白いのでF#で作り直すことにしました。Somaは、SQLやSQLに埋め込まれた簡易的な式言語をパースしたりするんですが、C#では正規表現をつかって何とかしてました。F#ではこのあたりの処理にF# PowerPackのfsyaccとfslexを使える…

Doma 1.12.0 リリース

Doma 1.12.0 をリリースしました。 ダウンロードはこちらからどうぞ。 http://doma.seasar.org/downloads.html Mavenをご利用の方はこちらを参照ください。 http://www.seasar.org/wiki/index.php?Maven2RepoRemote 今回のバージョンでは重要な変更が行われ…

Doma 1.12.0 で可能になったドメインクラスのファクトリメソッドの使いどころ

ドメインクラス(http://doma.seasar.org/reference/domain.html)は、これまで直接コンストラクタを呼び出すことでしか生成できなかったのですが、staticなファクトリメソッドを介して生成できるようになりました。ファクトリメソッドをアプリから呼び出せ…

Enumerable.SkipとSeq.skip

F#

Enumerable.Skipに相当するものがF#にはないんですね。Seq.skipは件数足りないときに例外なげます。Enumerable.Skip vs Seq.skipに対策方法が書いてあります。Seqという名前で自分のモジュールを作って、そこに関数おくのがわかりやすいかも。あたかも、F#の…

Seq.init と Seq.zip で FizzBuzz

F#

判別共用体とアクティブパターンも使いました。結構すっきり書けました。type FizzBuzz = | Str of string | Num of int[<Test>] let ``fizzbuzz with Seq.init and Seq.zip``() = let (|Incr|) n = n + 1 let create num s = Seq.init 100 (function Incr(n) -> i</test>…

Seq.groupBy と Seq.collect で FizzBuzz

F#

思いつきで試してみたらできました。一度、Seq.groupByで1から100までの数値をグループ分けし、その後でキーと値を入れ替えるような処理をSec.collectで行って、数値でソートして、文字でグループされていたかどうかをパターンマッチングでみて、最後に出力…

Seq.choose と Seq.exists で FizzBuzz

F#

無理やりな感が満載ですが。Seq.chooseで1から100までの数値をシーケンスのグループに分け、そのあとでSeq.existsでそれぞれのグループへの存在チェックをしています。[<Test>] let ``fizzbuzz with Seq.choose``() = let (|Fizz|_|) n = if n % 3 = 0 then Some()</test>…

関数合成 で FizzBuzz

F#

F# User Group - Japanにあるコードを参考にさせてもらいました。 https://groups.google.com/group/fsug-jp/browse_thread/thread/ca53aeedabe0a5c4?hl=ja type FizzBuzz = | Str of string | Num of int[<Test>] let ``fizzbuzz with function composition``() =</test>…

もっとアクティブパターンでFizzBuzz

F#

先日のアクティブパターンでFizzBuzzで書いた内容は今思うとあまりアクティブパターンのよさを引き出していないかも。 もっとアクティブパターンぽい方法を思いつきました。[<Test>] let ``fizzbuzz with partial active pattern``() = let (|Fizz|_|) n = if n % </test>…

判別共用体でFizzBuzz

F#

FizzBuzzの条件を判定する処理をばらばらのラムダ式にしてみました。 一度数値を判別共用体でラップしシーケンスにとります。後続のシーケンスでは、FizzBuzzの条件に合致したら値を置き換え、条件に合致しない場合や、すでにFizzBuzzしている場合はそのまま…

Seq.unfold と Seq.zip3 で FizzBuzz

F#

商を求めずに(%を使わないで)FizzBuzzできました。[<Test>] let ``fizzbuzz with Seq.unfold and Seq.zip3``() = let unfold num value = 1 |> Seq.unfold (fun n -> if num = n then Some(Some(value), 1) else Some(None, n + 1)) let nums = seq { for i in 1</test>…

Seq.scan で FizzBuzz

F#

これも商を求めないでFizzBuzz。Seq.scanを使ってみたかった。[<Test>] let ``fizzbuzz with Seq.scan``() = let fizzbuzz (f, b, value) n = let f', b' = f + 1, b + 1 match f, b with | 3, 5 -> (1 , 1 , "fizzbuzz") | 3, _ -> (1 , b', "fizz") | _, 5 -> (f</test>…

コード引用符から値名を取得してSQLのパラメータにバインディングするO/Rマッパーの案

F#

こんなO/Rマッパーがあったらどうだろう。[<Test>] let ``test`` () = let name = "jhon" let salary = 2000 let persons = query<Person> <@ let name = name in let salary = salary in " select * from person where name = /*name*/'a' and salary > /*salary*/0 " @> </person></test>…