ミュータブルなコレクション
💡 お知らせ: このドキュメントは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)
}
これは Apple、Pear、Mango を出力します。ここで 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 は新しいフルーツのミュータブルなリストを作成して返します。sweetFruits は rc を使ってミュータブルなメモリを確保するため、エフェクト r を持つことに注意してください。printFruits はフルーツのミュータブルなリストを受け取り、それらを出力します。この関数は r 内のミュータブルなメモリから読み取るためエフェクト r を持ち、また端末に出力するためエフェクト IO を持つことに注意してください。