Table of Contents
Google Gemini を使って、F# の基本的な学習をやってました。その記録を簡単にまとめておきます。
プロンプトは特に考えずに、F# を基本が学習したい と入力し、次に 1 日ひとつ F# に関する何かを学習したい と入力するだけ。
たった 2 つのプロンプトで短期のカリキュラムを考えてくれました。
それで実際生成されたものです。1 週間分あります。1 日 10 分くらいでできるものでした。内容が足りないと感じたら、もっと深く理解したい と入力すると、さらに課題を出してくれます。便利な世界になりましたね。
- Day 1: 不変性(Immutable)の安全さと、
letの基本 - Day 2: 関数をパーツのように扱う「カリー化と部分適用」
- Day 3: 括弧の地獄から解放される「パイプライン演算子(
|>)」 - Day 4: データの形を綺麗に仕分ける「パターンマッチ」
- Day 5: Nullの悪夢を世界から消し去る「
Option型」 - Day 6: 不正な状態を型レベルで防ぐ「判別共用体(DU)」
- Day 7: ループを使わずに宣言的にデータを加工する「コレクション操作」
#
学習した内容
##
「最後の引数をあえて省略して関数を定義する」スタイル(ポイントフリースタイルとも呼ぶ)
let multiply x y = x * y
let triple = multiply 3
let result = triple 4
printfn "結果は %d です" result // 12
##
パイプライン演算子(|>)
let square x = x * x
let increment x = x + 1
// パイプラインを使った書き方
let result = 4 |> square |> increment
printfn "結果は %d です" result // 17
実は (|>) という関数だという。
// 「左側の値 x と、右側の関数 f を受け取って、f に x を適用する(f x)」
let (|>) x f = f x
##
判別共用体(Discriminated Unions:DU)
「データは必ずいくつかのパターンのうちのどれか 1 つになる」として、パターンマッチと合わせて、すべて処理を記述しているかをコンパイラで検出できるようになるというもの。
以下の例では、「result のマッチ条件に漏れ(AccountLocked)」があるとコンパイル時に警告が出力される。「不正な状態」を型で検知する。
// 「ログイン結果」という型を定義。パターンの後ろにデータを持たせることもできる!
type LoginResult =
| Success of string // 成功した場合は「ユーザー名(string)」を持つ
| Failure of string // 失敗した場合は「エラー理由(string)」を持つ
| AccountLocked of string
// ログイン結果を判定する関数
let checkLogin result =
match result with // result のマッチ条件に漏れ(AccountLocked)があると警告がでる
| Success name -> sprintf "ログイン成功!ようこそ、%sさん。" name
| Failure reason -> sprintf "ログイン失敗。理由: %s" reason
let attempt1 = Success "Alice"
let attempt2 = Failure "パスワードが違います"
printfn "%s" (checkLogin attempt1)
printfn "%s" (checkLogin attempt2)
以上、Gemini との学習でした。