Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

F#で遊んでみる(1)

2年ぐらい前に、戯れにOCamlの勉強をしてみた。ML系の言語は、広く使われているとは言えないもののこれが必要な人にとっては他に換えがたいもののようである。その中で、OCamlという言語はMLとしては実用的な言語として開発母体もそこそこちゃんとしていて、それなりのエコシステムがあり、その手の人に広く使われているものらしい。

ところが、ここのところML系の言語の選択肢として、OCamlからMicrosoftのF#へと人気が移ってきているという記事をちらほらと見かけた。ホントなんだろうか。とりあえず、F#という言語が.net Frameworkのお仲間としてあるとは聞いているが、それはあのOCamlの代わりになるようなシロモノなんだろうか。

調べてみたら、そんなシロモノだった。というか、F#は.NETの上でOCamlすることが目的の言語で、むしろシンタックスはそっくりレベルのものだった。ただ、Visual Studio 2010に搭載されてデビューした当時は、MLを使いたいからといってそれだけの為に人はVSを買わなかっただろうし、VSを買う人が「せっかくだから」と使うわけもないし、私のような人には何のためにあるのかよくわかんない言語だと認識されていたように思う。しかし、そこから時は流れ、10年経ち、言語としてのF#は熟成が進み、ランタイムとしての.NETは.NET CoreとしてWindows以外の実行環境でもちゃんと動いて、かつ、無償で配布され、Visual Studio CodeによってVSがなくても、Windowsじゃなくても、全然問題なくなった。Linux上でF#を書いたり実行したり普通に出来て、ライブラリはMicrosoftの.Netエコシステムという非常に強力なものが使える。こりゃええわい・・・ということらしい。

そんじゃ、ま、とりあえず、Macの上でF#で気軽にコードを書いてみることができるのか。いや、関数型言語を気楽に書くような能力は私には全然ないわけだけども、とりあえず、どんな感じだか体感してみよう。

参考にするのは、この記事。

F# を知ってほしい - Qiita

さて、何はなくともインストール。Microsoftのサイトから、.NETのSDKを落としてくる。

dotnet.microsoft.com

ここで、.NET5を選べば良いのか、.NET Core 3.1を選べば良いのか・・・さっぱりわからない。.NET ⊇ .NET Core だと思う。たぶん、ASP.netが入っているかいないかとか、そういう差なんだと思うんだけど・・・わからない。ま、とりあえず、.NET 5をダウンロードして、インストーラーに従って入れてみる。

コマンドラインdotnetコマンド(これがnpmとかcargoみたいなものらしい)を実行してみよう。

> dotnet --info
.NET SDK (global.json を反映):
 Version:   5.0.102
 Commit:    71365b4d42

ランタイム環境:
 OS Name:     Mac OS X
 OS Version:  10.15
 OS Platform: Darwin
 RID:         osx.10.15-x64
 Base Path:   /usr/local/share/dotnet/sdk/5.0.102/

Host (useful for support):
  Version: 5.0.2
  Commit:  cb5f173b96

.NET SDKs installed:
  5.0.102 [/usr/local/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 5.0.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 5.0.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

To install additional .NET runtimes or SDKs:
  https://aka.ms/dotnet-download

ほほぅ。

さて、察するにdotnetがcargoみたいなものだとしたら、dotnet newとかするとアプリのテンプレートを作ってくれたりするに違いない。--helpオプションを付けてヘルプを参照して、こんな感じかなって実行してみた。

> dotnet new console -lang F#
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /Users/tambara/study/fs_study/fs_study.fsproj...
  復元対象のプロジェクトを決定しています...
  /Users/tambara/study/fs_study/fs_study.fsproj を復元しました (3.58 sec)。
Restore succeeded.

> ls
Program.fs       fs_study.fsproj  obj/

なんか出来たぞ?

では、このディレクトリをVSCで開いてみよう。EXTENSIONSのRECOMMENDEDにIonide-fsharpというのが上がってくる。これをインストールすればいいらしい。とりあえず、シンタックスハイライトは出来ているし、これでいいのかな。

当然、runも出来るのだろう。

> dotnet run
Hello world from F#

これでとりあえずの準備は良さそうだ。