Console
💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。
Flix は、ターミナル I/O のためのライブラリエフェクトとして Console を提供しています。Console エフェクトにはデフォルトハンドラがあるため、main の中で明示的に runWithIO を呼び出す必要はありません。主要なモジュールは Sys.Console です。
Console エフェクト
Console エフェクトは、標準入力からの読み取りと、標準出力および標準エラー出力への書き込みをサポートしています:
pub eff Console {
/// コンソールから 1 行を読み取ります。
def readln(): String
/// 与えられた文字列 `s` を標準出力に出力します。
def print(s: String): Unit
/// 与えられた文字列 `s` を標準エラー出力に出力します。
def eprint(s: String): Unit
/// 与えられた文字列 `s` を標準出力に出力し、続けて改行を出力します。
def println(s: String): Unit
/// 与えられた文字列 `s` を標準エラー出力に出力し、続けて改行を出力します。
def eprintln(s: String): Unit
}
Console モジュール
Console モジュールは、Console エフェクトの上に構築された、いくつかの高レベルな関数を提供します:
mod Sys.Console {
/// プロンプト `p` を出力して 1 行を読み取り、入力が空の場合は `default` を返します。
def readlnWithDefault(p: a, default: String): String \ Console
/// プロンプト `p` を出力して 1 行を読み取り、入力に `f` を適用します。
/// `Err(msg)` の場合は再度プロンプトを表示し、`Ok(v)` の場合は `v` を返します。
def readlnWith(p: a, f: String -> Result[String, b]): b \ Console
/// yes/no のヒント付きでプロンプト `p` を出力し、ブール値の回答を読み取ります。
/// 入力が空または認識できない場合は `default` を返します。
def confirm(p: a, default: {default = Bool}): Bool \ Console
/// 番号付きの選択肢リストとともにプロンプト `p` を出力し、選択を読み取ります。
/// 入力が無効な場合は `None` を返します。
def pick(p: a, choices: List[b]): Option[b] \ Console
/// `pick` と同様ですが、ユーザーが有効な選択をするまで再度プロンプトを表示します。
def pickWith(p: a, choices: List[b]): b \ Console
}
基本的なコンソール I/O
Console の最もシンプルな使い方は、プロンプトを出力し、入力を読み取り、応答することです:
use Sys.Console
def main(): Unit \ Console =
Console.print("What is your name? ");
let name = Console.readln();
Console.println("Hello ${name}!")
確認付き入力
Console.confirm 関数は yes/no の質問をして Bool を返します。ユーザーが何も入力せずに Enter を押した場合に使われるデフォルト値を指定できます:
use Sys.Console
def main(): Unit \ Console =
let proceed = Console.confirm("Deploy to production?", default = true);
if (proceed)
Console.println("Deploying...")
else
Console.println("Aborted.")
バリデーション付き入力
Console.readlnWith 関数は、入力がバリデータを通過するまで繰り返しユーザーにプロンプトを表示します。バリデータは、成功時には Ok(value) を返し、再度プロンプトを表示させるには Err(message) を返します:
use Sys.Console
def main(): Unit \ Console =
let n = Console.readlnWith("Enter a number (1-10): ", s ->
match Int32.fromString(s) {
case Some(i) if i >= 1 and i <= 10 => Ok(i)
case _ => Err("Please enter a number between 1 and 10.")
}
);
Console.println("You entered: ${n}")