Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

次のステップ

💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。

いよいよ、最初の本格的なプログラムを書く準備が整いました!

ここでは、UNIX の由緒あるワードカウント(wc)プログラムの簡単な変種を書いてみます。

この機会に、Flix で代数エフェクト(Algebraic effects)をどのように使うかを紹介します。

use Fs.FileRead

def wc(file: String): Unit \ { FileRead, IO } =
    match FileRead.readLines(file) {
        case Ok(lines) =>
            let totalLines = List.length(lines);
            let totalWords = List.sumWith(numberOfWords, lines);
            println("Lines: ${totalLines}, Words: ${totalWords}")
        case Err(_) =>
            println("Unable to read file: ${file}")
    }

def numberOfWords(s: String): Int32 =
     s |> String.words |> List.length

def main(): Unit \ { FileRead, IO } =
    wc("Main.flix")

このプログラムは次のように動作します。

まず、ファイル名を受け取り、FileRead エフェクトを使ってファイルからすべての行を読み込む wc 関数を定義します。

ファイルの読み込みに成功した場合は、次の値を計算します:

  • List.length を使った行数。
  • 各行に numberOfWords を適用した結果を合計して求めた単語数。

計算結果は println を使ってターミナルに出力されます。

ファイルを読み込めなかった場合は、代わりにエラーメッセージが出力されます。

wc 関数の型とエフェクトのシグネチャには、エフェクト集合 {FileRead, IO} が指定されており、これらのエフェクトが必要であることを示しています。FileReadIO はどちらもデフォルトハンドラを持っているため、main の中で明示的にハンドラを呼び出す必要はありません。