C#erがF#に入門してみた #1
2019-08-27
azblob://2022/11/11/eyecatch/2019-08-27-i-wanna-be-the-fsharper-000-e1566876232510.jpg

こんにちは、和田です。

最近の業務はずっとC#を書いていますが、たまには別な言語にも触りたいなーなんて思ったので、今回はF#にチャレンジしてみようと思います。人生で初めての関数型言語です。嘘です。2年前にRust触ろうとして挫折しました。

F#ってどんな言語?

F# is a mature, open source, cross-platform, functional-first programming language. It empowers users and organizations to tackle complex computing problems with simple, maintainable and robust code.

The F# Software Foundation

英語苦手マンが雑に訳すと、「F#はオープンソースでクロスプラットフォームな成熟した関数型プログラミング言語だよ!複雑な問題にもシンプルでメンテナンスしやすい堅牢なコードで立ち向かうことができるよ!」って感じでしょうか。

C#と同様、.NET上で動作します。そのため、F#のコード中からC#のライブラリを参照するのも容易なんだとか。種類豊富なC#ライブラリを使えるのは強いですね。

F#でどんなことができるの?

The F# Software FoundationのGUIDESを見てみると、次の項目があります。(2019/8/26 現在)

  • Enterprise Programming
  • Data Science
  • Web Programming
  • Mobile App and Game Programming
  • Machine Learning
  • Cloud Data, Compute and Messaging
  • Math and Statistics Programming
  • Data Access
  • Mac, Linux, and Cross-Platform

今流行りの機械学習にWebアプリ、モバイル、ゲームとか、これでもかってぐらいに手広げてます。これでF#が本当に書きやすい言語なら最高ですね。残念ながら日本ではあまり流行ってないみたいですが……。

Hello, World!

今回はF#入門第1回目、プログラミング言語の入り口といえばHello, World! というわけでHello, Worldなプログラムを見ていきましょう。.NET Coreのコンソールアプリケーションテンプレートに、Hello, Worldを出力するプログラムが含まれています。新しいディレクトリを作成して、次のコマンドを実行してみましょう。

$ dotnet new console --language "F#"

プロジェクトが作成されましたか?dotnet runで実行してみましょう。

$ dotnet run
Hello World from F#!

いい感じです!(語彙力の消失) それではコードを覗いてみましょうか。

// 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

……ブログのコードハイライト、F#に対応してなかった ???

まあ対応してないものは仕方ないですね。気を取り直して、C#とコードを比較していきます。ちなみに同等の動作をするC#のコードは次になります。(これはC#のconsoleテンプレートです)

using System;

namespace csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

一行ずつ見ていきましょう。

open System

System名前空間の使用を宣言しています。C#のusingに似てますね。

[<EntryPoint>]

F#では、エントリポイント(実行時に最初に呼び出される関数)となる関数をEntryPoint属性を使って宣言します。エントリポイントの型(引数と戻り値)はstring array -> intです。C#だとMainという名前のメソッドが自動的にエントリポイントとして扱われますが、F#では名前の制限はありません。mainじゃなくてtomari_mariでも動きました。C#同様日本語の命名もできるから兎鞠まりでも行けるぞ!

let 兎鞠まり argv =
    printfn "はろーわーるど!!!(⸝⸝⸝´꒳`⸝⸝⸝)"
    0 // return an integer exit code

かわいい(⸝⸝⸝´꒳`⸝⸝⸝)

さて、F#ではletで関数を定義します。

let 関数名 引数 = 処理

関数定義というより、変数宣言みたいですね。letを使っているあたり、 JavaScript / TypeScriptでものすごい見覚えがある。

関数の内容を複数行記述する場合、{}は使わず、Pythonのようにインデントでブロックを作ります。見た目がスッキリするので個人的には好きです。でもIDEのサポートが効きにくくなるのでちょっと書きにくいかも。

printfn "Hello World from F#!"

printfn "string"で文字列の表示ができます。C#と違い、F#では関数の引数を()で囲みません。関数の部分適用などのために必要な仕様らしい。これは慣れるまで大変そう……。

最後、0がmainの戻り値(プロセスのexit code)になります。F#では関数の最後に評価された値がその関数の戻り値になります。Rubyのメソッドみたいですね。

次回予告

やめて!ラーの顧客龍の特殊能力で、既存の仕様を焼き払われたら、闇のアジャイルでクソコードと戦ってる城之内の精神まで燃え尽きちゃう!

お願い、死なないで城之内!あんたが今ここで倒れたら、PMや営業との約束はどうなっちゃうの? バグはまだ残ってる。ここを耐えれば、納品日に間に合うんだから!

次回、「城之内死す」。デュエルスタンバイ!

次回予告(真)

次はなにかしらコードを書いてみようと思います。

たぶんWebとかかな (何も考えていない顔) 。