F#

DB上のNULLをどう表現するか

TranqというF#専用のDBアクセスライブラリについて話します。 https://github.com/nakamura-to/Tranq はじめに Tranqでは、F#らしくDB上のNULLをoption型で扱えます。たとえば、次のようなテーブル定義を考えます。 create table Person (Id int primary key…

TranqでF#の機能を最大限活用したDBアクセス

TranqというF#専用のDBアクセスライブラリを作りました。 https://github.com/nakamura-to/Tranq NuGetはこちら。 http://nuget.org/packages/Tranq/ Tranqを作った背景ですが、既存のDBアクセスライブラリだとF#の便利な機能を活かしにくいなと感じたので作…

TypeProviderでSQLのパラメータに型をつける

F#

コンピュテーション式でADO.NETのトランザクションを表現するアイデアを使いつつ、パラメータありのSQLをTypeProviderを使って(比較的)型安全に実行する方法を考えてみました。TypeProviderはF# 3.0で導入された、コンパイル時に型を生成する機能です。こ…

Lazyの合成

F#

Lazyのアクティブパターンを使うとすっきり書けることに気づきました。 (* ('a -> 'b -> 'c) -> Lazy<'a> -> Lazy<'b> -> Lazy<'c> *) let lift2 f x y = lazy ( let (Lazy a) = x let (Lazy b) = y f a b) do let x = lazy (10 + 20) let y = lazy (1 + 2) …

ピエールの綱渡り

F#

すごいHaskellたのしく学ぼう! にMaybeモナドの説明で、次のようなものがあります。 ピエールがバランス棒を持って綱渡りしている最中、バランス棒の左右に鳥がとまる。 左右の鳥の数の差が3より大きくなったらピエールは落下して綱渡りが失敗する。 左右の…

コンピュテーション式でADO.NETのトランザクションを表現するアイデア

F#

F#のコンピュテーション式がだんだんとわかってきたので思いついたアイデアをコードに落としてみました。 https://gist.github.com/4698060/5eae582bfda17733baa2f1944f858875324a1ea6 ADO.NETのトランザクションやコネクションの管理をすっきり書けるように…

F#でインタープリタ : 配列

F#

配列が使えるようになりました。実装はF#のリストですけど。 https://gist.github.com/4645884/2465fde0e7653fc8051979d7d54c83fd8d60146b 次のスクリプトを解釈させると a = [2, 3, 4] print(a[1]) a[1] = "three" print("a[1]: " + a[1]) b = [["one", 1],…

F#でインタープリタ : オブジェクト指向

F#

クラスの定義とインスタンス化ができるようになりました。 https://gist.github.com/4641973/925dbbb67ade2720c99099bf1f0c177aba0ecd20 class Position { x = 0 y = 0 def move(nx, ny) { x = nx y = ny } } class Pos3D extends Position { z = 0 def set(…

F#でインタープリタ : F#の関数や.NETのメソッドを呼び出す

F#

https://gist.github.com/4632243/73184b099d24ebcad956de5c01409224ccf96f9d F#の関数や.NETのメソッドを呼び出せるようにしました。 lengthで文字列の長さを返して、toIntで文字列を数値へ変換。printで出力。 次のコードを実行すると5が返ってきます。 s1…

F#でインタープリタ : クロージャの実装

F#

https://gist.github.com/4578600/687544edff499c54d4e5ea6fd2208244cdce1c1f やっとクロージャが実装できました。 def counter (c) { fun () { c = c + 1 } } c1 = counter(0) c2 = counter(0) c1() c1() c2() c1()上のコードを実行すると3が返ってきます。…

F#でインタープリタ

F#

半年前くらいにJavaでおもちゃスクリプトを作ってみましたが、今度はF#で挑戦。 https://gist.github.com/4578600 この週末にフィボナッチ計算ができるところまで作ってみました。 言語の構文は 2週間でできる! スクリプト言語の作り方 (Software Design pl…

ライブラリを作ってみて感じたF#の良いところや悩みどころ

F#

これはF# Advent Calendar 2012の5日目の記事です。昨日の記事は、kos59125さんのF# のための乱数生成フレームワークでした。私にとっては、あまりなじみのない世界の話で大変刺激的です。stateモナドはいつ見ても魔法のようです。自分もそろそろコンピュテ…

継承やインタフェースはほんとうにいらないかもしれない

F#

http://blog.livedoor.jp/gab_km/archives/1425937.htmlだって、F#にはレコードがありますから。(いまさらのリアクションでごめんなさい) type Animal = { name: string; bark: unit->string } let makeDog name = { name = name ; bark = fun () -> "Bow …

Soma 1.8.0.0 リリース

.NET向けO/Rマッパー Soma 1.8.0.0 をリリースしました。 ダウンロードはこちらからどうぞ。 zipファイル: https://github.com/nakamura-to/Soma/downloads NuGet: http://nuget.org/packages/Soma 動かしてみたいという方はクイックスタートをどうぞ。 クイ…

Soma 1.6.0.0 リリース

F#で作ったO/Rマッパー Soma 1.6.0.0をリリースしました。F#はもちろん、C#やVB.NETもサポートしています。 http://soma.codeplex.com/releases/view/77956 リリースノート New Feature - IConnectionObserverとICommandObserverを追加しました。 Change - S…

東京F#読書会第1回に参加してきました

F#

読書会だというのに本を読まず基本的に雑談?していました。 非常におもしろかったです。第2回もあるとうれしいです!で、自分が話題にしたことの補足をまとめておきます。 F#でO/Rマッパーつくりました http://soma.codeplex.com/ Option型のNoneは内部的に…

Haskellのbreak関数をF#で

F#

こんなかんじだと思う。let break' f list = let rec loop list acc = match list with | [] -> List.rev acc, list | h::t -> if f h then List.rev acc, list else loop t (h::acc) loop list [][1;2;3;4;5] |> break' ((=) 3) |> printfn "%A" // ([1; 2]…

F#でZipper

F#

F#erな方たちがよくHaskellの話題をしているのですが、さっぱりついていけないので、基本的なことは知っておこうと思い Learn You a Haskell for Great Good!: A Beginner's Guideを読んでみました。 完全に理解できたとは言いがたいですが、基本的な文法と…

F#の例外でメンバ定義

F#

http://d.hatena.ne.jp/einblicker/20110815/1313416546 こういった豆知識みたいなのは面白いですね。知らないものがあったので質問させてもらいました。ちょっと便乗して、もしかしたら他の人は意外と知らないかもしれないネタを書いてみます。 F#では、例…

Soma 1.5.0.0 の新機能紹介

C#のコードで紹介します。 検索条件パラメータでIDictionary等の利用をサポート これまでは、検索条件パラメータは匿名型のみをサポートしてました。 var empList = db.Query<Employee>( "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.</employee>…

Soma 1.5.0.0 リリース

Soma 1.5.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。 ダウンロードはこちら。 http://soma.codeplex.com/releases/view/72054 NuGetを使って簡単にセットアップできます。 クイックスタート(FShar…

Stateモナドでコネクション管理

これは結構使える!かも。open System open System.Transactions open FSharp.Monad.State open Soma.Corelet config = { new MsSqlConfig() with member this.ConnectionString = "Data Source=.;Initial Catalog=Soma.Tutorial;Integrated Security=True" …

プログラミングF#の状態ワークフローについてメモ

F#

プログラミングF#のp.268に状態ワークフロー(Stateモナド)を展開した次のような擬似コードがあります。StatefulFunc(fun initialState -> let result1, updatedState1 = OpenWebPage "www.bing.com" initialState updatedState1 |> (fun initialState -> l…

Soma 1.4.0.0 リリース

Soma 1.4.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。 ダウンロードはこちら。 http://soma.codeplex.com/releases/view/71193 NuGetを使って簡単にセットアップできます。 クイックスタート(FShar…

Soma 1.3.0.0 リリース

Soma 1.3.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。 ダウンロードはこちら。 http://soma.codeplex.com/releases/view/70125 NuGetを使って簡単にセットアップできます。 クイックスタート(FShar…

C#の非同期プログラミングモデル(APM)をF#のMailboxProcessorに書き換えてみた

C# F#

非同期処理が得意になりたいなぁと思います、最近。プログラミング.NET FRAMEWORK 第3版 (Microsoft Press)の27章にAPM(Asynchronous Programming Model)のいい例が載っていたので、勉強がてらF#のMailboxProcessorに書き換えてみました。 例のプログラム…

Somaの式コメントでオリジナルの関数を使う

このエントリは、Soma 1.2.0.0を利用する際のTipsです。 はじめに Somaでは、SQLを動的に組み立てるためにSQLコメント(式コメント)内で利用できる関数があらかじめ組み込まれていて、たとえば次のように使えます。 select * from Employee where /*%if not…

Soma 1.2.0.0 リリース

Soma 1.2.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。 ダウンロードはこちら。 http://soma.codeplex.com/releases/view/69733 NuGetを使って簡単セットアップできます。 クイックスタート(FSharp…

Soma 1.1.0.0 リリース

昨日1.0.0.0をリリースしたばかりでなんですが、Soma 1.1.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。ダウンロードはこちら。 http://soma.codeplex.com/releases/view/69471 NuGetを使ったダウンロ…

Soma 1.0.0.0 リリース

F#で作ったO/Rマッパー Soma 1.0.0.0をリリースしました(F#はもちろんC#やVB.NETでも使えます)。ダウンロードはこちら。 http://soma.codeplex.com/releases/view/69439 NuGetを使ったダウンロードもできます。 http://nuget.org/List/Packages/Soma Relea…