7 ポイント 投稿者 GN⁺ 2025-04-03 | 1件のコメント | WhatsAppで共有
  • F# は .NET をターゲットにする ML 系の関数型言語 であり、Microsoft が開発。主にオブジェクト指向の C# と比べて、F# は関数型プログラミングのパラダイム に重点を置いている
  • この記事は F# の言語的特徴、エコシステム、ドキュメント整備状況、開発ツール、活用事例、コミュニティの現状、F# vs. OCaml などを整理したもの

F# とは?

  • F# は簡潔で堅牢かつ高性能なコード を書くための汎用プログラミング言語
  • 複雑な文法を気にせず、問題解決そのものに集中できるよう設計されている
  • オープンソース、クロスプラットフォーム、.NET との高い互換性を備える
  • 特徴

    • 軽量な文法とデフォルトのイミュータビリティ
    • 型推論とジェネラライゼーション
    • 第一級関数、強力なデータ型、パターンマッチング
    • 非同期プログラミング(Async)をサポート
    • 有名な パイプライン演算子 (|>) の元祖となった言語
  • 簡単なサンプルコード

    open System  
    let names = [ "Peter"; "Julia"; "Xi" ]  
    let getGreeting name = $"Hello, {name}"  
    names |> List.map getGreeting |> List.iter (printfn "%s")  
    
  • F# は 2005 年に Microsoft Research で Don Syme が開発した言語として始まった
    • OCaml を .NET プラットフォームへ移植する研究プロジェクト(Caml.NET) に端を発する
    • その後 2010 年から正式製品に組み込まれ、2024 年には F# 9.0 がリリースされた
    • 2025 年現在は 20 周年を迎えた成熟した言語として位置づけられている
  • F# を試してみようと思った主な理由
    • .NET がオープンソースかつクロスプラットフォームへ進化した点を確認したかった
    • OCaml と比べた長所・短所を見たかった
    • Rider、Ionide などのツール群への評価が高かった
    • 単純に新しい言語を探究してみたかった

言語としての F#

  • F# は ML 系の関数型言語 で、OCaml ユーザーにはなじみやすい文法を持つ
  • Haskell や Lisp の使用経験がある開発者も比較的容易に適応できる
  • 空白ベースの構文構造を採用しており、Python のように インデントが構文上重要 である
  • 初心者でも基本文法を素早く習得できるよう設計されている
  • 言語機能の要約

    • 関数定義と適用 を簡潔かつ自然な形で表現できる
    • 条件分岐、ループ、タプル、リスト処理 などを関数型スタイルで整理して書ける
    • レコード、判別共用体(Discriminated Union)、パターンマッチング により複雑なデータ構造を簡潔に扱える
    • パイプライン演算子(|>)によってデータの流れを 関数の連結として視覚的に明快に構成 できる
    • F# は ad-hoc なスクリプト作成 に非常に向いており、.fsx ファイルとして書いて dotnet fsi ですぐ実行できる
    • REPL 環境も提供され、探索的プログラミング に向いている
  • 親しみやすい文法

    • 単一行・複数行コメントmutable 変数、リストスライスなど実用的な構文機能を含む
    • C# との高い互換性のおかげで .NET API を簡単に利用できる
    • さまざまな型に対する演算子オーバーロードも自然にサポートする
    • printfn で多様な型を容易に出力でき、デバッグやロギングに便利
  • 非同期プログラミングの先駆者

    • async/await パターンの元祖は F# 2.0 であり、その後 C# や JavaScript など多くの言語に影響を与えた
    • F# は非同期プログラミングを コールバックなしでも直感的に実装 できる構造を提供する
    • コードの流れは同期的に読める一方で、実際には非同期で動作する
  • Microsoft の投資と言語の発展

    • Microsoft は長年 F# に限られた人員しか割り当てていなかったが、2022 年にプラハで専任チームを組成し本格投資を開始 した
    • F# 8.0、9.0 のリリースを通じて 言語とツール群が急速に改善 されている
    • Microsoft 内部での関心も高まっており、今後の発展可能性 にも期待できる

F# は学びやすさと強力な型システム、関数型プログラミングのパラダイムを兼ね備えた実用的な言語であり、とりわけ .NET ベースのプロジェクトに関数型アプローチを導入したい開発者にとって非常に魅力的な選択肢 である

エコシステム(Ecosystem)

  • F# を比較的短期間使ってみた限りでは、純粋な F# 専用ライブラリやフレームワークはそれほど多くない
  • 多くのユーザーは .NET の標準 API や C# 中心に設計されたサードパーティライブラリ に依存している
  • これは Scala、Clojure、Groovy のような ホスト言語(hosted language) でよく見られる現象でもある
  • Web 開発向けの主要ライブラリ

    • Giraffe: ASP.NET Core ベースの軽量 Web フレームワークで、関数型スタイルを志向
    • Suave: ルーティングと処理の構成にコンビネータスタイルを採用したシンプルな Web サーバーフレームワーク
    • Saturn: Giraffe 上に構築された MVC スタイルのフレームワークで、Ruby on Rails や Phoenix に着想を得ている
    • Bolero: WebAssembly と Blazor ベースのクライアントアプリケーション開発フレームワーク
    • Fable: F# を JavaScript にトランスパイルし、React、Node.js などの JS エコシステムと連携可能にする
    • Elmish: Fable と組み合わせてよく使われる MVU(Model-View-Update)パターンベースの UI フレームワーク
    • SAFE Stack: Saturn、Fable、Elmish、Azure などを組み合わせたエンドツーエンドの関数型 Web 開発スタック
  • データサイエンス向け主要ライブラリ

    • Deedle: pandas スタイルのデータ分析・操作ライブラリ
    • DiffSharp: 機械学習と自動微分機能を提供する数学寄りのライブラリ
    • FsLab: 可視化、統計解析ツールなどを含むデータサイエンス統合ツールキット

ドキュメント整備状況

開発ツール(Dev Tooling)

  • F# の開発ツールのエコシステムは、かつては Visual Studio にのみ最適化 されており、それ以外のエディタのサポートは乏しかった
  • 幸いこの 10 年でツール環境は大きく改善した
  • 技術的な転換点: FSharp.Compiler.Service(FCS)

    • FCS は F# コンパイラ、エディタ支援機能、スクリプティングエンジンを含む単一ライブラリで、さまざまなエディタやツール環境で F# を使えるようにしている
    • これにより VS Code、ドキュメント生成ツール、代替バックエンドなどでも F# サポートが可能になり、エコシステム拡大を後押しした
    • 代表例として Ionide は VS Code 上で豊富な F# サポートを提供し、100 万ダウンロード以上 を記録している
  • 試したエディタ

    • Emacs (fsharp-mode): 基本機能はあるが TreeSitter 非対応で、開発活動も少ない
    • Zed: F# サポートは限定的
    • Helix: 基本サポートあり
    • VS Code(Ionide プラグイン): 最も完成度の高い環境のひとつ
    • JetBrains Rider: 商用 IDE だが F# サポートは非常に強力

    ほとんどの機能は F# 言語サーバー(fsautocomplete)を基盤としており、LSP サポートが優れたエディタならどれでも利用可能

  • 惜しい点

    • fsharp-mode は古いコードベースに基づいており進化が遅い
    • Zed は機能不足
    • VS Code は一部機能(例: 選択範囲の拡大・縮小)が正しく動作しない
    • キーバインドやモーダルモデルの問題により、VS Code を使いづらいと感じるユーザーもいる
  • コードフォーマッタとリンタ

    • Fantomas: F# 公式コードフォーマッタで、大半のユーザーやチームが利用している
    • FSharpLint: かつては人気だったが、現在は事実上停止状態
    • ただし 強力なコンパイラ のおかげでリンタ依存度は低い
  • その他のツール

    • Paket: .NET 向け依存関係マネージャ(npmpipbundler に近い)
    • FAKE: ビルドスクリプトを F# で書ける DSL で、Ruby の rake に近い

活用事例(Use Cases)

  • .NET の広範なエコシステムのおかげで、F# は多様な分野で活用の可能性がある
  • 特に 型プロバイダ(Type Providers) 機能のおかげで、データ分析や操作作業 に非常に適している
  • バックエンドサービスやフルスタックアプリケーション開発にも適しており、一部ツールは フロントエンド開発 まで可能にしている
  • 主な活用領域

    • データ分析: F# の型プロバイダを活用して静的型ベースのデータ操作が可能
    • バックエンドサービス: .NET の強力な Web フレームワークと組み合わせて F# を使える
    • フロントエンドアプリ: Fable と Elmish によって JS エコシステムと統合された UI 開発が可能
      • Fable 4 からは TypeScriptRustPython など複数言語にもトランスパイルできる
  • Fable の例(簡単なトランスパイルコマンド)

    • JavaScript:
      dotnet fable
    • TypeScript:
      dotnet fable --lang typescript
    • Python:
      dotnet fable --lang python

コミュニティの状況

  • 全体としてコミュニティは大きくなく、OCaml よりも小さい可能性がある
  • RedditDiscord チャンネルが最も活発なコミュニケーションの場
  • Slack コミュニティも存在するが、招待自動化システムの問題で参加しにくい
  • コミュニティにおける Microsoft の役割は明確ではなく、比較的コミュニティ主導の色が強い
  • コミュニティ運営の主要リソース

    • Amplifying F#: F# の普及と企業参加の促進
    • F# for Fun and Profit: チュートリアルとエッセイのアーカイブ
    • F# Lab: データサイエンス向け F# コミュニティツールキット
    • F# Weekly: 最新 F# ニュースをまとめるニュースレター

人気と現実(The Popularity Contest)

  • F# は多くの人気指標(TIOBE、StackOverflow、求人情報など)で上位ではない
  • ただしこれは多くの 関数型言語が置かれている現実 でもあり、F# 固有の問題ではない
  • 依然として主流ではないが、Clojure、OCaml、Emacs Lisp といった他の関数型言語と近い規模のユーザー層を持つ
  • なぜ F# を使うのか?

    • 就職のしやすさ以外にも プログラミング言語を選ぶ理由はさまざま
      • 楽しさのため(F# の F は “Fun” の意味だという言い方もある)
      • 新しいパラダイムやアイデアを学ぶため
      • 慣れた思考法から離れ、別の形で考える訓練のため
  • 関連資料

F# vs OCaml 比較

F# の初期の目的は、OCaml の長所を .NET に、.NET の長所を OCaml に持ち込むことだった
– Don Syme, F# の創始者

  • F# は OCaml に着想を得て開発され、初期には .ml.mli ファイル拡張子までサポートしていたほど類似性が高かった
  • 時間の経過とともに独立した言語へ進化し、今ではそれぞれ別の方向へ発展している
  • F# の利点

    • .NET プラットフォーム基盤
      • 膨大な数のライブラリを利用できる
    • Microsoft の支援
    • 初心者にやさしい
      • オブジェクト指向言語(C# など)の経験者にはなじみやすい文法
      • コンパイラのエラーメッセージが比較的明確
      • デバッグ体験がより直感的
    • 非同期プログラミングのサポートが強力
    • OCaml にない機能を提供
      • 匿名レコード
      • アクティブパターン
      • 計算式(computational expressions)
      • シーケンス内包表記
      • 型プロバイダ(type providers)
      • 単位付き型(units of measure)
  • F# の欠点

    • .NET プラットフォーム基盤
      • 言語設計において .NET との相互運用のための妥協が多い(null を許容するなど)
    • Microsoft 所有であること
      • Microsoft への好みの差がある
      • F# に割り当てられるリソースは比較的少ない
      • 長期的に Microsoft が F# をどこまで支援するかは不透明
    • 名前に関する問題
      • PascalCasecamelCase の命名規則が苦手な人にはつらい場合がある
      • F# という名前は検索やファイル名で問題を起こしやすい(そのため FSharp と表記されることも多い)
    • OCaml にある高度機能がない
      • 第一級モジュール、ファンクタ(functor)
      • GADT サポートの弱さ
    • マスコットもラクダもいない
  • 共通点と相互比較

    • どちらの言語も JavaScript ランタイムをターゲットにできる
      • F#: Fable
      • OCaml: js_of_ocaml, Melange
    • 現時点では Fable のほうが成熟している印象 だが、実運用経験はさらに必要
    • どちらも強力だがニッチな言語 であり、しばらく広範な大衆言語になる可能性は低い
    • F# には既存の C# コードベースへ少しずつ入り込める実用性がある
    • 欠点のひとつは F# プロジェクトが今なお XML ベースのプロジェクトファイルを使い、コンパイル順序を手動指定しなければならないこと
      • これは OCaml のビルドシステム Dune と比べると煩雑に感じられるかもしれない
    • 教育目的や言語構造の学習には OCaml が適している場合がある
    • 実用的な Web サービスやバックエンド開発が目的なら F# のほうがより良い選択になりうる
    • 特に .NET とよく統合されつつ関数型スタイルを維持できる言語として、F# は非常に強力なツールである

まとめの感想

  • 筆者は F# を、思っていた以上に はるかに面白く実用的な言語 だと感じた
    • かつて Clojure に初めて触れたときに近い感覚だったと述べている
    • 特に、Clojure が Java との優れた相互運用性のおかげで 最も実用的な Lisp だったことを思い起こさせた
  • もし .NET が最初からオープンソースかつポータブルだったなら、
    • ClojureCLR が今よりも人気を得ていた可能性
    • F# のコミュニティやエコシステムもさらに成長していたはず という惜しさが語られている
  • F# が 2010 年までオープンソースではなかったことも 初期採用の妨げになった

".NET と F# の両方が初期にオープンソースでなかったことが最大の過ちであり、そのせいで多くの機会を失った" – Don Syme

  • OCaml も学ぶのが難しいわけではないが、ML 系言語を初めて学ぶ人には F# のほうが易しいかもしれない
    • 本番導入までの参入障壁も低い
  • 特に .NET の経験がある開発者なら F# はぜひ一度触れてみる価値がある と強調している
    • F# は独立した言語として優れているだけでなく、.NET の強力なエコシステムを活用する機会も与えてくれる
  • Fable のようなツールを通じて F# コードを JavaScript、Dart、Rust、Python などへトランスパイルできる
  • F# コミュニティには「F# の F は Fun(楽しさ)だ」という言い方がある
    • 筆者自身も実際に使ってみてそれが本当だと感じ、面白いだけでなく実用的でもある と強調している
  • 最後に「コンパイルが通れば大抵はちゃんと動く」という F# の安定性と信頼性にも触れている

In sane type systems we trust!

1件のコメント

 
GN⁺ 2025-04-03
Hacker Newsのコメント
  • Ruby on Railsアプリを書き直す際、F#は最良の関数型言語だった

    • Haskell、Ocaml、Scala、F#を検討した
    • Microsoft技術には慣れていなかったが、F#が第一候補になった
    • Haskellは純粋性のため採用しにくく、Ocamlはエコシステムが不足していた
    • Scalaは複雑に見えた
    • F#は始めやすく、コミュニティは親切で賢く、助ける準備ができていた
    • dotnetライブラリにアクセスできる優れたエコシステムがある
    • HTTPサーバーと簡単にやり取りできるFsHttpのような優れたライブラリやフレームワークがある
    • WebSharperはあらゆるエコシステムの中で最高のWebフレームワークだった
    • ツールは最高の状態ではないが、言語への情熱は大きい
  • F#を試したが、.NETエコシステムには不慣れだった

    • "hello world"のために多くのプロジェクトファイルやボイラープレートが生成されて驚いた
    • FP、不変性、モダンな言語を支持しているが、仕事が少ない
    • AIで使いやすい言語を好む傾向がある
    • インドでは状況はさらに悪いが、EUではJava/TypeScriptで持続可能な生活ができる
    • Kotlin + TypeScriptで高給の仕事を見つけるのは難しい
  • 私たちの会社は6年前にC#からF#へ移行した

    • Cスタイル言語からの移行は難しいが、その価値はある
    • コンパイル速度が遅く、ホットリロードはサポートされていない
    • 仕事で使う機会は少ない
    • 開発者の採用が難しい場合がある
  • F#の採用が停滞した理由はビルドシステムの悪さにある

    • Rustは優れた言語だが、多くの問題領域には適していない
    • Rustが選ばれる理由はビルドシステムにある
    • 非営利財団があり複数企業が支援する言語でさえ、依然として悪いビルドシステムを持っている
  • 2013年にF#を学び、とても楽しかった

    • ユーザー体験は良くなかった
    • 命名規則、関数呼び出しスタイル、基本構文、型システムの機能、IDEサポートに問題があった
    • Scalaに移行し、F#より一貫性があると感じた
    • F#は最初の関数型言語で、プログラミングに対する見方を変えた
  • F#は、すべてのユーザーが非常に満足している稀なケースだ

    • .NETエコシステムに慣れているので、学びやすそうだ
    • どのようなワークフローが最も大きな恩恵を受けられるのか気になる
  • C#がF#の多くの機能を取り込むにつれ、F#の利点は薄れつつある

    • C#コードを主に関数型スタイルで書いているが、ライブラリを本来のやり方で使える利点がある
  • F#で完全に書かれた収益性のあるSaaSがある

    • 3dpack.ing
    • F#で書かれたRustレイトレーサーがWebAssemblyにコンパイルされる
    • fable-raytracer
  • F#は素晴らしい言語だ

    • 1行も書かなくても、優れたサンプル言語だ
    • fsharpforfunandprofit.comをよく参照する
  • F#は美しいが、流暢に使うのは難しかった

    • C#を少ししか知らなかったため、F#のオブジェクト指向的なやり方を理解するのが難しかった
    • ClojureやScalaでも同じ問題に直面した
    • C#やJavaを先に学びたいとは思わない