著者は、 Free Software Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

F#は、アプリケーションとサービスを構築するためのMicrosoftのツール、ライブラリ、および言語のセットである .NET を拡張するために、MicrosoftResearchで最初に開発されたオープンソースプログラミング言語です。 非常に簡潔な構文に加えて、F#は複数のパラダイムをサポートしています。つまり、主に関数型プログラミングアプローチを利用するように設計されていますが、さまざまな種類のコード構造化を実行できます。

特定のパラダイム、またはコードのスタイルを採用することで、プログラミングの問題解決の考え方と整理方法が決まります。 命令型アプローチ C++Javaなどの言語で使用される設計モデルを使用して、開発者はコンピューターがタスクを実行する方法を段階的に説明します。 これは、プログラムの実行時にメモリの状態を変更する一連のステートメントを作成することです。 これは、不規則な状況が発生するまでは正常に機能します。 たとえば、複数のアプリケーションで同時に使用される共有オブジェクトについて考えてみます。 別のコンポーネントが値を変更しているのと同時に、その値を読み取りたい場合があります。 これらは、メモリ位置に対する同時アクションであり、データの不整合や未定義の動作を引き起こす可能性があります。

関数型コード設計では、可変状態、または作成後に変更される可能性のある状態の使用を最小限に抑えることで、この種の問題を防ぎます。 ここでのキーワードは関数であり、引数として提供されるいくつかの情報の数学的変換を指します。 関数型コードは、実行する関数のセットとしてソリューションを構成することにより、プログラムが何であるかを表現します。 通常、別の関数を返すか、他の関数を入力として受け取ることができる関数を使用して、ロジックのレイヤーを構築します。

F#を使用した関数型プログラミングには、次のような多くの利点があります。

  • プログラムの保守性を向上させる、より読みやすく表現力豊かな構文。
  • テスト用に分離できるステートレス関数により、コードが破損しにくく、デバッグが容易です。
  • 非同期プログラミングとより安全な並行性を促進するネイティブ構造。
  • コミュニティ共有パッケージを含む、.NETの世界にあるすべての既存のツールへのアクセス。

ランタイムの選択

F#はクロスプラットフォームであるため、さまざまなオペレーティングシステムで同様の実行モデルの動作を維持することが不可欠です。 .NETは、ランタイムを使用してこれを実現します。 ランタイムシステムは、特定のプログラミング言語で記述されたプログラムの実行を調整し、オペレーティングシステムとのインターフェイスやメモリ管理などを処理するソフトウェアです。

Linuxで利用できる.NETランタイム実装は、実際には .NETCoreMonoの2つです。 歴史的に、.NETはWindowsでのみ機能していました。 当時は、コミュニティのMonoプロジェクトに頼って、LinuxやmacOSなどの他のプラットフォームで.NETアプリケーションを実行することができました。 その後、Microsoftは、複数のプラットフォームを対象とする、元の.NETFrameworkのより高速なモジュラーサブセットである.NETCoreを立ち上げました。

このチュートリアルの発行時点では、どちらもWebアプリケーションまたはコマンドラインユーティリティの構築に使用できます。 とはいえ、.NET CoreはLinuxおよびmacOSでGUIデスクトップアプリケーションを作成するためのモデルを出荷していませんが、Monoはモバイルおよびゲームプラットフォームをサポートする唯一のモデルです。 選択するランタイムがビルドするプログラムを形作るので、これらの違いを知ることは重要です。 また、すべてのユースケースを考慮し、より生産的なスタックを作成するために、.NETCoreとMonoの両方をインストールすることを選択することもできます。

このチュートリアルでは、.NET CoreランタイムとMonoランタイムの両方を使用して、Ubuntu 18.04でF#プログラミング環境をセットアップします。 次に、ビルドメソッドとコンパイルメソッドをテストおよびレビューするためのコード例をいくつか記述します。

前提条件

このチュートリアルを完了するには、コマンドラインと、sudo権限を持つ非rootユーザー Ubuntu18.04を実行しているコンピューターの基本的な知識が必要です。

手順1— .NET Coreを使用したF#のインストール

Microsoftは、F#開発者向けに .NET Coreソフトウェア開発キット(SDK)を提供しています。 ソフトウェア開発キットは、プログラマーが特殊なアプリケーションを作成し、それらをさまざまなオペレーティングシステムに適合させることを可能にするプログラミングツールのセットです。 従来、他のコンポーネントの中でも、テキストエディタ、言語サポート、ランタイム、コンパイラが含まれています。 このステップでは、このSDKをインストールします。 ただし、最初に、Microsoftリポジトリを登録し、いくつかの依存関係を取得します。

コマンドラインでインストールとセットアップを完了します。これは、コンピューターと対話するための非グラフィカルな方法です。 つまり、ボタンをクリックする代わりに、テキストを入力し、テキストを介してコンピューターからフィードバックを受け取ることになります。

シェルまたはターミナルとも呼ばれるコマンドラインは、コンピューターで毎日実行するタスクの多くを変更および自動化するのに役立ち、ソフトウェア開発者にとって不可欠なツールです。 あなたがより強力なことをすることを可能にすることができる学ぶべき多くのターミナルコマンドがあります。 コマンドラインの詳細については、Linuxターミナルの概要チュートリアルをご覧ください。

Ubuntu 18.04では、画面の左上隅にあるUbuntuアイコンをクリックし、検索バーにterminalと入力すると、ターミナルアプリケーションを見つけることができます。 ターミナルアプリケーションアイコンをクリックして開きます。 または、キーボードのCTRLALT、およびTキーを同時に押すと、ターミナルアプリケーションが自動的に開きます。

Ubuntu Terminal

ターミナルを開いたら、wgetコマンドを使用して、必要なファイル、Microsoftリポジトリの構成、およびサーバー通信用のキーを含むパッケージをダウンロードします。

  1. wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

次に、Microsoftリポジトリを追加し、dpkg -i命令を使用してパッケージをシステムにインストールします。

  1. sudo dpkg -i packages-microsoft-prod.deb

次に、 Universe リポジトリをアクティブにします。これは、Ubuntuでは、無料でオープンソースのソフトウェアのコミュニティが管理するアーカイブです。 これにより、apt-transport-httpsにアクセスできるようになります。これは、UbuntuパッケージマネージャーのAPTトランスポートをHTTPS経由で有効にするための依存関係です。

  1. sudo add-apt-repository universe
  2. sudo apt install apt-transport-https

次に、利用可能なダウンロードを更新します。

  1. sudo apt update

最後に、.NETSDKの現在のバージョンをインストールします。 このチュートリアルでは、バージョン2.2を使用します。

  1. sudo apt install dotnet-sdk-2.2

.NET SDKがインストールされたので、すべてがうまくいったかどうかを確認する簡単な方法は、SDKをダウンロードしてインストールするとシェルで使用できる.NET Coreコマンドラインインターフェイス(CLI)を試すことです。 ターミナルに次のように入力して、.NETセットアップに関する情報を表示します。

  1. dotnet --info

dotnetコマンドを初めて実行すると、次のようなテキストセクションが表示されます。

Output
Welcome to .NET Core! --------------------- Learn more about .NET Core: https://aka.ms/dotnet-docs Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs Telemetry --------- The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell. Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry ...

この通知は収集されたデータに関するものであり、一部の.NETCLIコマンドが使用状況情報をMicrosoftに送信することを説明しています。 これはすぐに無効になります。 今のところ、dotnet --infoからの出力を見てください。

しばらくすると、ターミナルに.NETのインストールに関する情報が一覧表示されます。

Output
.NET Core SDK (reflecting any global.json): Version: 2.2.101 Commit: 236713b0b7 Runtime Environment: OS Name: ubuntu OS Version: 18.04 OS Platform: Linux RID: ubuntu.18.04-x64 Base Path: /usr/share/dotnet/sdk/2.2.101/ Host (useful for support): Version: 2.2.0 Commit: 1249f08fed .NET Core SDKs installed: 2.2.101 [/usr/share/dotnet/sdk] .NET Core runtimes installed: Microsoft.AspNetCore.All 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All] Microsoft.AspNetCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App] To install additional .NET Core runtimes or SDKs: https://aka.ms/dotnet-download

SDKのバージョンによっては、出力が若干異なる場合がありますが、これにより、.NETCoreを使用する準備ができていることが確認されます。

前述のように、テレメトリ機能を使用すると、一部の.NETCLIコマンドで使用状況情報をMicrosoftに送信できます。 これはデフォルトで有効になっており、DOTNET\_CLI\_TELEMETRY_OPTOUT環境変数を1に設定することで無効にできます。 これを行うには、テキストエディタで開いて.profile環境カスタマイズファイルに新しい行を追加します。 このチュートリアルでは、nanoを使用します。

  1. nano ~/.profile

.profileの末尾に次の行を追加します。

〜/ .profile
. . .
export DOTNET_CLI_TELEMETRY_OPTOUT=1

CTRLおよびXキーを押して、nanoを終了します。 ファイルを保存するように求められたら、Yを押してから、ENTERを押します。

sourceコマンドを使用して、新しい構成をアクティブ化できます。

  1. source ~/.profile

今後、テレメトリは起動時にオフになります。

この時点で、.NET Coreランタイム、言語サポート、およびライブラリがインストールされており、いくつかの.NETアプリケーションを実行および構築できます。 dotnet CLIは、.NETソースコードとバイナリの管理にも使用できます。 F#プロジェクトの構築を開始することもできますが、前述のように、.NET Core環境は、完全にクロスプラットフォームであるために必要なすべての構成を提供するわけではありません。 今のところ、たとえばモバイルアプリケーションの開発には使用できません。

この問題を解決するために、次のステップでF#を再度インストールしますが、今回はMonoを使用します。

手順2— Monoを使用したF#のインストール

Monoを使用して、.NETCoreによって残された機能の残りのギャップを埋めることができます。 Monoと.NETCoreはどちらも同じ標準ライブラリに基づいており、どちらも.NET言語をサポートしていますが、類似点はここで終わります。 それらは異なるランタイム、異なるCLI、および異なるコンパイラーを使用し、それらを並べてインストールして、より信頼性の高いプログラミング環境を作成することを可能にします。 このセクションでは、.NETプログラミング用のMonoツールを使用して環境を補完し、コマンドラインからF#プログラムを実行します。

モノのバージョンはUbuntuリポジトリで利用できますが、これは古くなっている可能性があります。 代わりに、公式Monoパッケージリポジトリをパッケージマネージャーに追加します。

  1. sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
  2. echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list

上記のコマンドでは、apt-keyを使用して、公式のMonoリポジトリから転送されたパッケージを保護するためのキーを取得しました。 次に、Monoパッケージのソースをリポジトリリストに追加しました。

APT用に追加された新しいソースリストを使用して、リポジトリを更新します。

  1. sudo apt update

次に、Monoツールをダウンロードします。 .NET Coreとは異なり、MonoにはF#ツールが含まれていないため、別のパッケージとしてダウンロードします。 次のコマンドを使用して、fsharpおよびmono-completeメタパッケージをインストールします。

  1. sudo apt install mono-complete fsharp

注:このダウンロードのサイズにより、mono-completeのインストールプロセスに時間がかかる場合があります。

完了すると、コンパイラfsharpcと、fsharpiまたは単にFSIと呼ばれるインタラクティブシェルが作成されます。 FSIは、シェル内の環境であり、ユーザーの入力を式として受け取り、それを評価してから、結果を出力し、別の入力を待ちます。 これは、従来のシェルでコマンドを入力して結果を確認するのと同じですが、ここでは、入力はF#式です。 FSIは、コードをテストしたり、スクリプトを実行したりするための高速な方法を提供します。

次のコマンドでFSIをアクティブにします。

  1. fsharpi

これにより、インタラクティブセッションが開始され、通常のプロンプトがfsharpiプロンプトに置き換えられます。

Output
Microsoft (R) F# Interactive version 4.1 Copyright (c) Microsoft Corporation. All Rights Reserved. For help type #help;; >

#quit;;を実行すると、デフォルトのシェルに戻ることができます。 fsharpiでは、各コマンドラインは二重のセミコロンで終わります。

printfn関数を使用して、パラメーターとして渡されたメッセージをレンダリングする簡単な操作を試してみましょう。

  1. printfn "Hello World!";;

次の出力が表示されます。

Output
Hello World! val it : unit = () >

上記の相互作用から、fsharpiは式をユニットタイプ値として評価します。 次にコードが実行され、結果がそのタイプとともに出力されます。

fsharpiは、F#コードを含むファイルを実行することもできます。 スクリプトには、.fsx拡張子を付けて名前を付け、次のコマンドを使用してシェルから実行する必要があります。

  1. fsharpi some_script.fsx

F#のインストールが機能していることがわかったので、シェルを次のように残します。

> #quit;;

Monoと.NETCoreをインストールすると、あらゆる種類のF#プログラムを作成する準備が整います。 FSIを使用すると、コードをテストし、必要に応じていくつかのスクリプトを実行できますが、実行は遅くなります。 F#スクリプトを実行するには、追加の手順を実行して、ソースコードをプロセッサが理解できるアーティファクトに変換するため、速度が低下します。 これを解決するために、次のセクションでは、.NET Coreを使用してコードをコンパイルし、マシンですぐに実行できるスタンドアロンのバイナリファイルを作成します。

ステップ3— .NET Coreを使用したF#プログラムの作成とコンパイル

この手順では、.NET Coreで提供されるコマンドラインコンパイラを使用してF#ソースコードをコンパイルします。 これにより、アプリケーションを高速化し、特定のシステム用に事前設定された実行可能パッケージを作成して、プログラムの配布を容易にすることができます。

コンパイルは、ソースコードをバイナリファイルに変換する変換プロセスです。 この変換を実行するソフトウェアは、コンパイラと呼ばれます。 .NET Coreは、dotnetCLIに依存してコンパイルを実行します。 これを実証するために、コンパイルケースを確認するための基本的なF#ソースを作成します。

dotnet CLIは、完全なアプリケーションビルドツールチェーンを提供します。 一般に、コマンドとdotnetドライバーの関連付けは、タスクを完了するためにシェルで使用されます。 例えば:

  • dotnet newはプロジェクトを作成します
  • dotnet buildは、プロジェクトとそのすべての依存関係を構築します
  • dotnet add packageは、プロジェクトファイルにパッケージ参照を追加します

以下は、FSharpHelloという新しいコンソールプロジェクトを作成します。 -langオプションは、コーディングするプログラミング言語を設定し、-oオプションは、出力を配置するディレクトリを作成します。

  1. dotnet new console -lang F# -o FSharpHello

これが完了したら、新しく作成したプロジェクトディレクトリに移動します。

  1. cd FSharpHello

このディレクトリには、FSharpHello.fsprojプロジェクト構成ファイルと、一時オブジェクトファイルの保存に使用されるobjフォルダが含まれています。 デフォルトのソースコードが存在するProgram.fsファイルもあります。 テキストエディタで開きます。

  1. nano Program.fs

ファイルには、 HelloWorldプログラムが自動的に入力されています。

Program.fs
// Learn more about F# at http://fsharp.org

open System

[<EntryPoint>]
let main argv =
    printfn "Hello World from F#!"
    0 // return an integer exit code

このコードでは、Systemモジュールをopen Systemでインポートし始め、次にプログラムのエントリポイント、つまりシェルから起動したときにプログラムが開始する場所を定義します。 main関数は、コンソールへのHello Worldメッセージの出力を呼び出し、プログラム(return an integer exit code)を停止します。

ファイルを終了します。

このコードをコンパイルして実行するには、プロジェクトディレクトリ~/FSharpHelloから次を使用します。

  1. dotnet run

プログラムが実行され、次の出力が画面に出力されます。

Output
Hello World from F#!

FSIの場合と同様に、このプログラムの実行には時間がかかることに注意してください。 前述したように、実行可能ファイル、つまりオペレーティングシステムで直接実行できるバイナリファイルを生成することで、これをより高速に実行できます。 これを実現する方法は次のとおりです。

  1. dotnet publish -c release -r linux-x64

これにより、実行可能bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dllファイルが生成されます。 これは、64ビットLinuxアーキテクチャで実行される共有ライブラリです。 macOSシステムの汎用実行可能ファイルをエクスポートするには、linux-x64ランタイム識別子( RID )をosx-x64に置き換えます。

次に、次のコマンドを使用してファイルを実行します。

  1. dotnet bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll

今回は、プログラムがすでにバイナリに変換されているため、出力をはるかに速く受け取ることができます。

.NET Coreでコンパイルする方法がわかったので、Monoが専用のfsharpcコマンドを使用してプログラムをコンパイルする方法を見てみましょう。

ステップ4— Monoを使用したF#プログラムの作成とコンパイル

Monoのコンパイルプロセスは.NETCoreのプロセスと似ていますが、今回はプログラムのコンパイルに使用される特定のコマンドがあります。 fsharpcコマンドはツールであり、コンパイル専用に作成されています。

今回は、hello.fsファイルを作成し、F#コードを記述します。 まず、ホームディレクトリに戻ります。

  1. cd

次に、hello.fsという名前の新しいファイルを開きます。

  1. nano hello.fs

次の行をファイルに追加します。

hello.fs
open System

前に見たように、これはSystemモジュールまたは名前空間をインポートし、組み込みのシステム関数やConsoleなどのオブジェクトにアクセスできるようにします。

次に、コードをさらに数行追加します。

hello.fs
open System

let hello() =
    printf "Who are you? "
    let name = Console.ReadLine()
    printfn "Oh, Hello %s!\nI'm F#." name

これらの新しい行は、hello()関数を定義して、ユーザー入力を読み取り、フィードバックメッセージを出力します。

これで、最後の行を追加できます。

hello.fs
open System

let hello() =
    printf "Who are you? "
    let name = Console.ReadLine()
    printfn "Oh, Hello %s!\nI'm F#." name

hello()
Console.ReadKey() |> ignore

ここでは、関数hello()を呼び出し、ReadKey()メソッドを使用して、最後のキーストロークでプログラムを終了します。

ファイルを保存して終了します。

fsharpcコマンドで、-oフラグを使用して出力ファイル名を定義し、hello.fsソースコードを次のようにコンパイルします。

  1. fsharpc hello.fs -o hello

上記のコマンドは、monoコマンドで実行できるhello実行可能ファイルを生成します。

  1. mono hello

これにより、次の出力が得られ、ユーザー入力を待ちます。

Output
Who are you?

Sammyと入力すると、次のようになります。

Output
Oh, Hello Sammy! I'm F#.

最後のキーストロークを押すと、プログラムが終了します。

おめでとう! これで、Monoと.NET Coreの両方を使用して最初のF#プログラムを作成およびコンパイルしました。

結論

このチュートリアルでは、.NET Core環境とMono環境の両方をカバーするF#プログラミング用のツールをインストールしました。 また、F#コードの例とビルドされた実行可能ファイルもテストしました。 これらは、この実用的な関数型言語を学ぶための最初のステップです。

次のステップは、学習 言語で、コミュニティに連絡することです。 また、プロジェクトがより複雑になると、コードとリソースをより効率的に管理する必要がある場合があります。 NuGetPaketなどのパッケージマネージャーは、.NETを中心に構築された強力なエコシステムと、大規模なプログラムを編成するための選択ツールへの架け橋です。