F#ってこんな言語2 -- アクティブパターン
//アクティブパターンの定義
let (|Even|Odd|) n =
if n % 2 = 0 then Even else Odd
// 定義したアクティブパターンに基づいた分岐
let f = function
| Even -> printfn "even"
| Odd -> printfn "odd"
F#ってこんな言語2 -- Maybeモナド
//ビルダーを定義して、
type MaybeBuilder () =
member __.Return(x) = Some x
member __.Bind(x, f) = Option.bind f x
let maybe = MaybeBuilder()
// 使う
let someFunc arg =
maybe {
let! x = f arg
let! y = g x
let! z = h y
return z
}
22.
F#ってこんな言語2 -- 言語内DSLの例
//F#向けテスティングフレームワーク
let ``f should throw HogeException`` = test {
let! e = trap { it (f ()) }
do! e.GetType() === typeof<HogeException>
}
let ``g should return correct list`` =
let test (arg, expected) = test {
do! g arg === expected
}
parameterize {
source [
(0, [])
(1, [0])
(2, [0; 1])
]
do! test
}
F#ってこんな言語2 --- 消去型TPの例
typeRecordRegex = Regex< @"(?<Name>^[^,]+),s*(?<Address>.+)" >
let res = RecordRegex().Match("山田太郎, どこか")
let name = res.Name.Value
let address = res.Address.Value
(* コンパイルすると、下記のコードと同じコードに展開される *)
// RecordRegexという型は消える
let res =
Regex(@"(?<Name>^[^,]+),s*(?<Address>.+)").Match("山田太郎, どこか")
// 型のプロパティとして見えていたものはただのインデクサを使ったアクセスへ
let name = res.Groups.["Name"].Value
let address = res.Groups.["Address"].Value
F#ってこんな言語2 -- 生成型TPの例
//実際に型が作られる
type Edmx = EdmxFile<"Model.edmx">
let context = new Edmx.Model.Entities(conStr)
query { for user in context.Users do
where (user.Age >= 20)
select user }
|> Seq.iter (fun user -> printfn "%s" user.Name)
(* Model.edmxを読み込み、メタデータを取得し、
メタデータをもとにdbmlファイル(!)を生成し、
SqlMetal.exeにdbmlファイルを食わせることでC#ファイルを生成(!?)。
最終的に生成されたC#ファイルをコンパイル(!?!?)している。 *)
・"An Atom Editorand Visual Studio Code package suite for
cross platform F# development."
・などなど
F#の開発環境
・Visual Studio
・Visual F# Tools(VS標準搭載)
・Visual F# Power Tools
・Ionide