F#でちょっと遊ぶ - 1 - 単純な電卓

  • F#って言語機能が強くて、Haskellのような、言語処理系界のスーパーカーに見えます。(個人の感想です。)
  • 今回は「F#の言語機能を使うためにコードを書く」という本末転倒の目標を掲げて、初心者がF#をおそるおそる触ってみる記事です。間違いや、「こうすればもっと面白いよ!」といった指摘やアドバイスがもしあれば、 Twitter: @kaito_tateyama へリプライかDMで連絡いただけると嬉しいです。

F#の導入

  • 必要なものは以下の通りです。
dotnet # .NET Core CLI
fantomas # formatter
  • インストール方法です。まずdotnetを入れていきます。Ubuntuだと https://docs.microsoft.com/en-us/dotnet/core/install/linux-debian を見ておくとよさそうです。
  • 今回は言語機能が知りたいだけなので、現時点での最新であるdotnet 5.0(preview)を入れます。(私が使っているOSはUbuntu20.04です)
$ dotnet-sdk.dotnet --version
5.0.100-rc.2.20479.15
# https://github.com/dotnet/core/blob/master/release-notes/5.0/preview/5.0.0-rc.2-install-instructions.md
  • 次にformatterを入れます
$ dotnet-sdk.dotnet tool install -g fantomas-tool
$ fantomas Program.fs # format
  • F#ではプロジェクトという単位を作り、その中にファイルをいくつかおいて実行します。(ファイル単体でスクリプトのようにも扱えるらしい?)
  • new, runといったコマンドを覚えるのが面倒なのでMakefileを作っています。
arg = "default"
target = "Program.fs"
new:
	@dotnet-sdk.dotnet new console -lang="F#" -o ./${arg}
	@cp .gitignore ./${arg}/.gitignore
run:
	@dotnet-sdk.dotnet run --project ./${arg}
fmt:
	@fantomas ./${target}
  • 以下のようにしていきます
$ make arg=Name new # make project
$ make arg=Name run # run project
$ make target=Name/Program.fs fmt # format project
  • 以下を実行すると、ハローワールドできると思います
make arg=minilang new
make arg=minilang run
# Hello world from F#

ディレクトリ構成

  • ディレクトリ構成を見ていきます。
minilang/
├── bin/
├── minilang.fsproj
├── obj/
├── Program.fs
├── .gitignore
└── README.md
  • bin/とobj/はgitignoreします。
  • Program.fsがスタート地点になります。(ファイルの中を見ると、[<EntryPoint>]があります。ここが開始地点です)

ファイルの中身を出力する

  • ここでの目標は「Eitherを使う」ということです。

test?そろそろテスト駆動にしたい

  • ここでテストのためのパッケージを入れる必要があるので、Makefileを見直して、テストが入っているプロジェクトが生成されるようにしようと思います。

その他

  • Ionide
$ code --install-extension ionide.ionide-fsharp
$ sudo ln -sv /snap/dotnet-sdk/current/dotnet /usr/local/bin/dotnet
  • もしaptで3.1入れてたらそれは消す。
  • 上2つでdotnetコマンド(dotnet5.0)をionideが認識できるようになり、補完や静的チェックが効くようになる。
  • paket
dotnet-sdk.dotnet tool -g install paket
  • paketは今回はだめだった。