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によって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。

Flix の標準ライブラリは、option、list、chain、set、map をはじめとする多くのイミュータブルなコレクションをサポートしています。これらの利用を強くおすすめします。

加えて、Flix の標準ライブラリはいくつかのミュータブルなコレクションも提供しています:

  • MutList[t, r] : 型 t の要素からなる、伸縮可能で連続した配列。
  • MutSet[t, r] : 型 t の要素からなるミュータブルな set。
  • MutMap[k, v, r] : 型 k のキーを型 v の値に対応づけるミュータブルな map。
  • MutDeque[t, r] : 型 t の要素からなるミュータブルな両端キュー(double-ended queue)。

Flix では、ミュータブルなコレクションを含むすべてのミュータブルなメモリがリージョンに属することを思い出してください。

次は MutList[t] の使い方の例です:

def main(): Unit \ IO =
    region rc {
        let fruits = MutList.empty(rc);
        MutList.push("Apple", fruits);
        MutList.push("Pear", fruits);
        MutList.push("Mango", fruits);
        MutList.forEach(println, fruits)
    }

これは ApplePearMango を出力します。ここで MutList[String, rc] は、要素が push(または pop)されるたびに自動的に拡張(または縮小)します。

上記のプログラムは、!> パイプライン演算子を使って、より 流れるようなスタイル(fluent-style) で書くこともできます:

def main(): Unit \ IO =
    region rc {
        let fruits =
            MutList.empty(rc) !>
            MutList.push("Apple") !>
            MutList.push("Pear") !>
            MutList.push("Mango");
        MutList.forEach(println, fruits)
    }

上記のプログラムは、次のように複数の関数に分割できます:

def main(): Unit \ IO =
    region rc {
        let fruits = sweetFruits(rc);
        printFruits(fruits)
    }

def sweetFruits(rc: Region[r]): MutList[String, r] \ r =
    MutList.empty(rc) !>
    MutList.push("Apple") !>
    MutList.push("Pear") !>
    MutList.push("Mango")

def printFruits(fruits: MutList[String, r]): Unit \ {r, IO} =
    MutList.forEach(println, fruits)

ここで main 関数は新しいリージョン rc を導入します。このリージョンを sweetFruits に渡し、sweetFruits は新しいフルーツのミュータブルなリストを作成して返します。sweetFruitsrc を使ってミュータブルなメモリを確保するため、エフェクト r を持つことに注意してください。printFruits はフルーツのミュータブルなリストを受け取り、それらを出力します。この関数は r 内のミュータブルなメモリから読み取るためエフェクト r を持ち、また端末に出力するためエフェクト IO を持つことに注意してください。