nikkie-ftnextの日記

イベントレポートや読書メモを発信

F#に慣れるために、自分だけのクソコンソールアプリケーションを作る

はじめに

からあげ帝国、バンザイ!! nikkieです。

春ですね。F#する春です🌸

慣れるための素振りをしていきましょう。

目次

F#で自分だけのクソコンソールアプリケーションを作る

この記事では、F#で小さなコンソールアプリケーションを作ります。
我が主(=皇帝)のからあげさんの記事に、オマージュ捧げていく形となります。

Python1

.
├── unko/
│   ├── __init__.py
│   └── unko.py
└── pyproject.toml

F#版(今回作ったもの)

.
├── Unko/
│   └── Unko.fs
├── Program.fs
└── UnkoFSharp.fsproj
% dotnet run
puripuri

順を追って見ていきましょう。

コンソールアプリケーションを作る

dotnet new console -lang F#コマンドでスキャフォールディングします。

このドキュメントとは異なり、Project.fsには

printfn "Hello from F#"

としか書かれていません。
これをドキュメントにあるようにしていきます。

let deru = printfn "puripuri"

[<EntryPoint>]
let main argv =
    deru
    0

deru関数を定義し、main関数の中で呼び出しています。

ちなみにコンソールアプリケーションはこちら

「明示的なエントリ ポイント」を使ってますね

モジュールを導入

このあたりはGPT-4に聞きつつ、ドキュメントにあたって進めました。

1つのファイルにderu関数があるのはクソの系譜の美学に反するので、別のファイルに分離していきます。
これは「モジュール」というそう2

ルート直下のUnko.fsに切り出してもよいのですが、ディレクトリを導入することにしました(Unko/Unko.fs)。

module Unko

let deru = printfn "puripuri"

fsprojファイルに追加します。

  <ItemGroup>
+    <Compile Include="Unko/Unko.fs" />
    <Compile Include="Program.fs" />
  </ItemGroup>

ここは順番に意味があるそう。
逆順だとビルドできません。

Program.fsではopenします。

+open Unko
-let deru = printfn "puripuri"

[<EntryPoint>]
let main argv =
    deru
    0

頻繁に使用されるモジュールと名前空間に open キーワードを使用すると、そのモジュールまたは名前空間のメンバーを参照するときに、完全修飾名の代わりに短い形式の名前を使用することができます。

Unkoモジュールのderu関数は、Unkoモジュールをopenするとderuとして参照できるようです

こうしてF#版Unkoが完成しました!🙌
Unko/Unko.fsの文字列を変更してdotnet runすると、出力される文字列が変わります。

終わりに

F#に慣れるために、小さなコンソールアプリケーションを作る素振りをしました。
モジュールを作り、それをopenするんですね(open Unko

fsprojファイルはファイルごとにCompileを書く必要があるようです。
ディレクトリを指定できたら楽な気がするんですが、F#の大きなライブラリはどうしてるんでしょうか3

P.S. nikkieによるunkoオマージュギャラリー

皇帝のお言葉


  1. pyproject.tomlを使ったバージョンで示します(P.S.参照)
  2. 名前空間というやつでもできるかも(宿題事項)
  3. VS Code拡張のIonideに案内された fantomas のリポジトリを見ると、なにかわかるかも