著者は、 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 検索バーに。 ターミナルアプリケーションアイコンをクリックして開きます。 または、 CTRL, ALT、 と T キーボードのキーを同時に押して、ターミナルアプリケーションを自動的に開きます。

ターミナルを開いたら、 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、HTTPSを介したUbuntuパッケージマネージャーAPTトランスポートを有効にするための依存関係。

  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

出口 nano を押すことによって CTRLX キー。 ファイルを保存するように求められたら、を押します Y その後 ENTER.

を使用して新しい構成をアクティブ化できます source 指図:

  1. source ~/.profile

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

この時点で、.NET Coreランタイム、言語サポート、およびライブラリがインストールされており、いくつかの.NETアプリケーションを実行および構築できます。 The 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#ソースコードをコンパイルします。 これにより、アプリケーションを高速化し、特定のシステム用に事前設定された実行可能パッケージを作成して、プログラムの配布を容易にすることができます。

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

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

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

以下は、という新しいコンソールプロジェクトを作成します FSharpHello. The -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次に、プログラムのエントリポイント、つまりシェルから起動したときにプログラムが開始する場所を定義します。 The 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のプロセスと似ていますが、今回はプログラムのコンパイルに使用される特定のコマンドがあります。 The 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

上記のコマンドは、 hello で実行できる実行可能ファイル mono 指図:

  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を中心に構築された強力なエコシステムと、大規模なプログラムを編成するための選択ツールへの架け橋です。