著者はhttps://www.brightfunds.org/organizations/free-software-foundation-inc[Free Software Foundation]を選択して、https://do.co/w4do-cta [Write forの一部として寄付を受け取るDOnations]プログラム。
前書き
https://fsharp.org [F#]は、Microsoft Researchで最初に開発されたオープンソースのプログラミング言語で、https://dotnet.microsoft.com/ [.NET]、Microsoftのツール、ライブラリ、および構築する言語のセットを拡張します。アプリケーションとサービス。 F#は非常に簡潔な構文に加えて、複数のhttps://en.wikipedia.org/wiki/Programming_paradigm[paradigms]をサポートしています。つまり、主に関数型プログラミングアプローチを活用するように設計されていますが、さまざまなタイプのコード構造化が可能です。 。
特定の_paradigm_またはコードのスタイルを採用することで、プログラミングの問題解決を考えて整理する方法が決まります。 _imperativeアプローチ_では、https://en.wikipedia.org/wiki/C%2B%2B [C ++]またはhttps://www.java.com/en/[Java]などの言語で使用される設計モデル開発者は、コンピューターがタスクを達成する方法を段階的に説明します。 プログラムの実行時にメモリの状態を変更する一連のステートメントを記述することです。 これは、不規則な状況が発生するまで正常に機能します。 たとえば、複数のアプリケーションで同時に使用される_共有オブジェクト_を考えてください。 別のコンポーネントが値を変更するのと同時に値を読み取りたい場合があります。 これらは、データの不整合と未定義の動作を引き起こす可能性のあるメモリ位置に対する「同時アクション」です。
functional code designでは、mutable states、またはそれらを作成した後に変更できます。 ここで関数はキーワードであり、引数として提供されるいくつかの情報の数学的変換を指します。 機能コードは、実行する機能のセットとしてソリューションを構成することにより、プログラムが何であるかを表します。 通常、別の関数を返すか、入力として他の関数を使用できる関数を使用して、ロジックのレイヤーを構築します。
F#を使用した関数型プログラミングには、多くの利点があります。
-
プログラムの保守性を向上させる、より読みやすく表現力のある構文。
-
テスト用に分離できるステートレスな機能により、壊れにくく、デバッグが容易なコード。
-
非同期プログラミングとより安全な同時実行を促進するネイティブ構造。
-
コミュニティ共有パッケージを含む、.NETの世界のすべての既存ツールへのアクセス。
ランタイムの選択
F#はクロスプラットフォームであるため、異なるオペレーティングシステムを通じて同様の実行モデルの動作を維持することが不可欠です。 .NETは、ランタイムを使用してこれを実現します。 _ランタイムシステム_は、特定のプログラミング言語で書かれたプログラムの実行を調整するソフトウェアであり、オペレーティングシステムとメモリ管理などとのインターフェイスを処理します。
実際には、Linuxで利用可能な2つの.NETランタイム実装があります:https://docs.microsoft.com/en-us/dotnet/core/[.NET Core]およびhttps://www.mono-project.com [Mono] 。 従来、.NETはWindowsでのみ機能していました。 当時、LinuxやmacOSなどの他のプラットフォームで.NETアプリケーションを実行するために、コミュニティのMonoプロジェクトに頼ることができました。 その後、Microsoftは、複数のプラットフォームをターゲットとするために、元の.NETフレームワークのより高速なモジュール式サブセットである.NET Coreを立ち上げました。
このチュートリアルの公開時点では、どちらもWebアプリケーションまたはコマンドラインユーティリティの構築に使用できます。 つまり、.NET CoreはLinuxおよびmacOSでGUIデスクトップアプリケーションを作成するためのモデルを出荷していませんが、Monoはモバイルプラットフォームとゲームプラットフォームをサポートする唯一のモデルです。 選択するランタイムによって、ビルドするプログラムが決まるため、これらの違いを知ることが重要です。 また、すべてのユースケースを考慮し、より生産的なスタックを作成するために、.NET CoreとMonoの両方をインストールすることもできます。
このチュートリアルでは、.NET CoreランタイムとMonoランタイムの両方を使用して、Ubuntu 18.04でF#プログラミング環境をセットアップします。 次に、ビルドおよびコンパイルメソッドをテストおよびレビューするためのコード例を作成します。
前提条件
このチュートリアルを完了するには、コマンドラインと、https://www.digitalocean.com/community/tutorials/initialでhttp://releases.ubuntu.com/18.04[Ubuntu 18.04]を実行しているコンピューターの基本的な知識が必要です。 -server-setup-with-ubuntu-18-04#step-2-%E2%80%94-creating-a-new-user [非ルートユーザーsudo特権]。
手順1-.NET Coreを使用したF#のインストール
Microsoftは、F#開発者向けにhttps://docs.microsoft.com/en-us/dotnet/core/sdk[.NET Core Software Development Kit(SDK)]を提供しています。 ソフトウェア開発キットは、プログラマーが特殊なアプリケーションを作成し、それらをさまざまなオペレーティングシステムに適応できるようにするプログラミングツールのセットです。 従来は、他のコンポーネントの中でも、テキストエディター、言語サポート、ランタイム、コンパイラーが含まれていました。 このステップでは、このSDKをインストールします。 ただし、最初に、Microsoftリポジトリを登録し、いくつかの依存関係を取得します。
コマンドラインでインストールとセットアップを完了します。これは、コンピューターと対話する非グラフィカルな方法です。 つまり、ボタンをクリックする代わりに、テキストを入力し、テキストを介してコンピューターからフィードバックを受け取ります。
_shell_または_terminal_としても知られるコマンドラインは、コンピューターで毎日行うタスクの多くを変更および自動化するのに役立ち、ソフトウェア開発者にとって不可欠なツールです。 より強力なことを実行できるようにするために、学ぶべき多くの端末コマンドがあります。 コマンドラインの詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-the-linux-terminal [Linuxターミナルの紹介]チュートリアルをご覧ください。
Ubuntu 18.04では、画面の左上隅にあるUbuntuアイコンをクリックして、検索バーに「+ terminal 」と入力することにより、ターミナルアプリケーションを見つけることができます。 ターミナルアプリケーションアイコンをクリックして開きます。 または、キーボードの「 CTRL」、「+ ALT」、「+ T +」キーを同時に押すと、ターミナルアプリケーションが自動的に開きます。
image:https://assets.digitalocean.com/articles/eng_python/UbuntuDebianSetUp/UbuntuSetUp.png [Ubuntuターミナル]
ターミナルを開いたら、 `+ wget +`コマンドを使用して、いくつかの必要なファイル、Microsoftリポジトリー構成、およびサーバー通信用のキーを含むパッケージをダウンロードします。
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
次に、Microsoftリポジトリを追加し、 `+ dpkg -i +`命令を使用してシステムにパッケージをインストールします。
sudo dpkg -i packages-microsoft-prod.deb
次に、_Universe_リポジトリをアクティブにします。これは、Ubuntuでは、コミュニティが管理する無料のオープンソースソフトウェアのアーカイブです。 これにより、HTTPSを介したUbuntuパッケージマネージャーAPTトランスポートを有効にするための依存関係である、「+ apt-transport-https +」にアクセスできます。
sudo add-apt-repository universe
sudo apt install apt-transport-https
次に、利用可能なダウンロードを更新します。
sudo apt update
最後に、.NET SDKのhttps://dotnet.microsoft.com/download/linux-package-manager/ubuntu18-04/sdk-current[current version]をインストールします。 このチュートリアルでは、バージョン2.2を使用します。
sudo apt install dotnet-sdk-
dotnet --info
初めて `+ dotnet +`コマンドを実行すると、次のようにテキストセクションが表示されます。
OutputWelcome 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
...
この通知は収集されたデータに関するものであり、一部の.NET CLIコマンドがMicrosoftに使用情報を送信することを説明しています。 すぐにこれを無効にします。今のところ、 `+ dotnet --info +`からの出力を見てください。
しばらくすると、ターミナルに.NETインストールに関する情報が一覧表示されます。
Output.NET Core SDK (reflecting any global.json):
Version:
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//
Host (useful for support):
Version:
Commit: 1249f08fed
.NET Core SDKs installed:
[/usr/share/dotnet/sdk]
.NET Core runtimes installed:
Microsoft.AspNetCore.All [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App [/usr/share/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
SDKのバージョンに応じて、出力は若干異なる場合がありますが、これにより.NET Coreを使用する準備ができていることが確認されます。
前述のように、テレメトリ機能により、一部の.NET CLIコマンドでMicrosoftに使用情報を送信できます。 デフォルトで有効になっており、環境変数 `+ DOTNET \ _CLI \ _TELEMETRY_OPTOUT `を ` 1 `に設定することで無効にできます。 そのためには、テキストエディタで開いて、 ` .profile`環境カスタマイズファイルに新しい行を追加します。 このチュートリアルでは、 `+ nano +`を使用します。
nano ~/.profile
次の行を `+ .profile`の最後に追加します:
〜/ .profile
. . .
export DOTNET_CLI_TELEMETRY_OPTOUT=1
`+ CTRL `キーと ` X `キーを押して、 ` nano `を終了します。 ファイルの保存を求められたら、「 Y 」を押してから「 ENTER +」を押します。
`+ source +`コマンドを使用して新しい設定を有効化できます:
source ~/.profile
これからは、起動時にテレメトリーがオフになります。
この時点で、.NET Coreランタイム、言語サポート、およびライブラリがインストールされ、いくつかの.NETアプリケーションを実行およびビルドできます。 .NETソースコードとバイナリの管理には、 + dotnet +
CLIも利用できます。 F#プロジェクトの構築を開始できますが、前述のように、.NET Core環境は完全にクロスプラットフォームであるために必要なすべての構成要素を提供しません。 現時点では、たとえばモバイルアプリケーションの開発には使用できません。
この問題を解決するために、次の手順ではF#を再度インストールしますが、今回はMonoを使用します。
手順2-MonoでF#をインストールする
Monoを使用して、.NET Coreが残した機能の残りのギャップを埋めることができます。 Monoと.NET Coreはどちらも同じ標準ライブラリに基づいており、どちらも.NET言語をサポートしていますが、それで類似性は終わります。 異なるランタイム、異なるCLI、および異なるコンパイラを使用するため、これらを並べてインストールして、より信頼性の高いプログラミング環境を作成できます。 このセクションでは、環境を.NETプログラミング用のMonoツールで補完し、コマンドラインからF#プログラムを実行します。
MonoのバージョンはUbuntuリポジトリで利用可能ですが、これは時代遅れかもしれません。 代わりに、https://www.mono-project.com/download/stable/#download-lin [公式Monoパッケージリポジトリ]をパッケージマネージャーに追加します。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
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の新しいソースリストを追加して、リポジトリを更新します。
sudo apt update
次に、Monoツールをダウンロードします。 .NET Coreとは異なり、MonoにはF#ツールが含まれていないため、別のパッケージとしてダウンロードします。 次のコマンドを使用して、 `+ fsharp `および ` mono-complete +`メタパッケージをインストールします。
sudo apt install mono-complete fsharp
完了したら、コンパイラ `+ fsharpc `と、 ` fsharpi +`または単にFSIと呼ばれる対話型シェルが作成されます。 FSIはシェル内の環境であり、ユーザーの入力を式として受け取り、評価してから結果を出力し、別の入力を待機します。 従来のシェルでコマンドを入力して結果を確認するのと同じですが、ここでの入力はF#式です。 FSIは、コードをテストしたり、スクリプトを実行したりする高速な方法を提供します。
次のコマンドでFSIをアクティブにします。
fsharpi
これにより、対話型セッションが開始され、通常のプロンプトが `+ fsharpi +`プロンプトに置き換えられます。
OutputMicrosoft (R) F# Interactive version 4.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
For help type #help;;
>
- `+#quit
-
`を実行すると、デフォルトのシェルに戻ることができます。 ` fsharpi +`では、各コマンドラインはダブルセミコロンで終わります。
`+ printfn +`関数を使用して、パラメーターとして渡されたメッセージをレンダリングする簡単な操作を試してみましょう。
printfn "Hello World!";;
次の出力が表示されます。
OutputHello World!
val it : unit = ()
>
上記の相互作用から、 + fsharpi +`は、式をhttps://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/unit-type [
+ unit +` type]値として評価します。 その後、コードが実行され、結果がそのタイプとともに出力されます。
`+ fsharpi `はF#コードを含むファイルを実行することもできます。 スクリプトには、拡張子「 .fsx +」を付けて、コマンドからシェルから実行する必要があります。
fsharpi .fsx
F#インストールが機能していることがわかったので、シェルを次のようにしておきます。
> #quit;;
Monoおよび.NET Coreをインストールすると、あらゆる種類のF#プログラムを作成する準備ができました。 FSIを使用すると、コードをテストし、必要に応じていくつかのスクリプトを実行できますが、実行は遅くなります。 F#スクリプトを実行するには、追加の手順を実行して、ソースコードをプロセッサが理解できるアーティファクトに変換するため、速度が低下します。 これを修正するには、次のセクションで.NET Coreを使用してコードをコンパイルし、マシンですぐに実行できるスタンドアロンのバイナリファイルを作成します。
手順3-.NET Coreを使用したF#プログラムの作成とコンパイル
この手順では、.NET Coreで提供されるコマンドラインコンパイラーを使用してF#ソースコードをコンパイルします。 これにより、アプリケーションを高速化し、特定のシステム用に事前設定された実行可能パッケージを作成できるため、プログラムの配布が容易になります。
_Compiling_は、ソースコードをバイナリファイルに変換する変換プロセスです。 この変換を実現するソフトウェアは、コンパイラと呼ばれます。 .NET Coreはコンパイルを実行するために + dotnet +
CLIに依存しています。 これを実証するために、基本的なF#ソースを作成して、コンパイルのケースを確認します。
+ dotnet +
CLIは、完全なアプリケーション構築ツールチェーンを提供します。 一般に、コマンドと `+ dotnet +`ドライバーの関連付けは、タスクを完了するためにシェルで使用されます。 例えば:
-
`+ dotnet new +`はプロジェクトを作成します
-
`+ dotnet build +`はプロジェクトとそのすべての依存関係をビルドします
-
`+ dotnet add package`はパッケージ参照をプロジェクトファイルに追加します
以下は、 `+ FSharpHello `という新しいコンソールプロジェクトを作成します。 ` -lang `オプションは、コーディングに使用するプログラミング言語を設定し、 ` -o +`オプションは、出力を配置するディレクトリを作成します。
dotnet new console -lang F# -o
これが完了したら、新しく作成したプロジェクトディレクトリに移動します。
cd
このディレクトリには、 `+ .fsproj `プロジェクト設定ファイルと、一時オブジェクトファイルの保存に使用される ` obj `フォルダが含まれます。 デフォルトのソースコードが存在する ` Program.fs +`ファイルもあります。 テキストエディターで開きます。
nano Program.fs
ファイルには* Hello World *プログラムが自動的に入力されています。
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
このコードでは、 + open System +`で `+ System +`モジュールのインポートを開始し、プログラムエントリポイント、つまりシェルから起動したときにプログラムが開始する場所を定義します。 `+ main`関数はコンソールに表示される
+ Hello World`メッセージを呼び出し、プログラムを停止します( + return a integer exit code +
)。
ファイルを終了します。
このコードをコンパイルして実行するには、プロジェクトディレクトリ `+〜/ +`から以下を使用します。
dotnet run
プログラムが実行され、次の出力が画面に出力されます。
OutputHello World from F#!
FSIの場合と同様に、このプログラムの実行には時間がかかったことに注意してください。 前述したように、実行可能ファイル、つまりオペレーティングシステムで直接実行できるバイナリファイルを生成することにより、これをより高速に実行することができます。 これを実現する方法は次のとおりです。
dotnet publish -c release -r linux-x64
これにより、実行可能な `+ bin / release / netcoreapp / linux-x64 / publish / .dll `ファイルが生成されます。 これは、64ビットLinuxアーキテクチャで実行される共有ライブラリです。 macOSシステム用の汎用実行可能ファイルをエクスポートするには、 ` linux-x64 `ランタイム識別子(https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#using-rids[RID]を置き換えます)と「 osx-x64 +」。
次のコマンドでファイルを実行します。
dotnet bin/release/netcoreapp/linux-x64/publish/.dll
今回は、プログラムがすでにバイナリに変換されているため、出力がはるかに速くなります。
手順4-Monoを使用したF#プログラムの作成とコンパイル
Monoのコンパイルプロセスは.NET Coreのプロセスと似ていますが、今回はプログラムのコンパイルに使用される特定のコマンドがあります。 `+ fsharpc +`コマンドはツールであり、コンパイル専用に作成されています。
今回は、 `+ hello.fs +`ファイルを作成し、F#コードを記述します。 最初に、ホームディレクトリに戻ります。
cd
次に、 `+ hello.fs +`という名前の新しいファイルを開きます:
nano hello.fs
ファイルに次の行を追加します。
hello.fs
前に見たように、これは `+ System `モジュールまたは名前空間をインポートし、組み込みのシステム関数や ` Console +`などのオブジェクトにアクセスできるようにします。
次に、さらにいくつかのコード行を追加します。
hello.fs
open System
これらの新しい行は、ユーザー入力を読み取り、フィードバックメッセージを出力するための `+ hello()+`関数を定義します。
これで、最終行を追加できます。
hello.fs
open System
let hello() =
printf "Who are you? "
let name = Console.ReadLine()
printfn "Oh, Hello %s!\nI'm F#." name
ここでは、関数 `+ hello()`を呼び出してから、 ` ReadKey()+`メソッドを使用して、最後のキーストロークでプログラムを終了しています。
ファイルを保存して終了します。
これで、 `+ fsharpc `コマンドで、 ` -o `フラグを使用して出力ファイル名を定義し、 ` hello.fs +`ソースコードを次のようにコンパイルします。
fsharpc hello.fs -o hello
上記のコマンドは、 `+ mono `コマンドで実行できる ` hello +`実行可能ファイルを生成します。
mono hello
これにより、次の出力が得られ、ユーザー入力を待機します。
OutputWho are you?
「++」と入力すると、次のようになります。
OutputOh, Hello !
I'm F#.
最後のキーストロークを押すと、プログラムが終了します。
おめでとうございます。 Monoと.NET Coreの両方を使用して、最初のF#プログラムを作成およびコンパイルしました。
結論
このチュートリアルでは、F#プログラミング用のツールをインストールし、.NET Core環境とMono環境の両方をカバーしました。 また、F#コードのサンプルをテストし、実行可能ファイルをビルドしました。 これらは、この実用的な関数型言語を学ぶための最初のステップです。
次のステップは、https://fsharpforfunandprofit.com/series/thinking-functionally.html [learn] languageにアクセスし、httpsと連絡を取ることです。 //fsharp.org/community/projects/[community]。 また、プロジェクトがより複雑になると、コードとリソースをより効率的に管理する必要が生じる場合があります。 https://www.nuget.org [NuGet]やhttps://fsprojects.github.io/Paket/[Paket]などのパッケージマネージャーは、。プログラム。